Autor Téma: Tvorba komponent i pro 64bit platformu  (Přečteno 685 krát)

Offline paja666

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: 10.4.2 Sydney
Tvorba komponent i pro 64bit platformu
« kdy: 01-04-2021, 16:01:07 »
Mám vlastní balík komponent (založených na standardních VCL komponentách TEdit, TRadioButton, TPanel) a rád bych je použil i pro 64bit platformu. Rozšířil jsem tedy deklaraci třídy každé komponenty o deklaraci [ComponentPlatformsAttribute(pfidWindows)] a u většiny komponent se mi objevilo v návrháři Supported platforms: Windows 32 a Windows 64. Ovšem u pár komponent nikoliv. Např. u vlastního potomka Panelu. Tam zůstalo pouze Windows 32.

Deklarace je založená na TCustomPanelu.

  [ComponentPlatformsAttribute(pfidWindows)]
  TG3Panel = class(TCustomPanel)

Kde by mohl být zakopaný pes? Balíček komponent jsem i odebral/přidal. Na disku se více verzí nevyskytuje.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1199
  • Karma: 51
    • Verze Delphi: 10.3
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #1 kdy: 01-04-2021, 19:12:34 »
Nevím :-) Vlastně až teď, když jsem četl dotaz, jsem se podíval, jak to je u mne, a komponenta odvozená od tPanel se také tváří, že je jen pro Win32. (Atributy u ní nemám, protože je stařičká a tehdy jsem o atributech nic nevěděl, popř. v Delphi ani nebyly.) Nicméně aplikaci pro Win64 s ní normálně zkompiluju.

Je fakt, že když to teď zkouším, nejde přidat do formuláře, když mám vybraný target Win64, jen jsem si toho nikdy nevšimnul, protože normálně tam mívám Win32 a pouze pak kompiluju pro Win64.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle

Offline paja666

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: 10.4.2 Sydney
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #3 kdy: 01-04-2021, 21:36:22 »
stačilo by tohle?
http://docwiki.embarcadero.com/RADStudio/Sydney/en/64-bit_Windows_Application_Development#Considerations_for_64-bit_Applications

Už jsem si to pročítal dříve, ale stále nerozumím tomu, proč je část komponent (z jednoho balíčku) označena jako Win32 + Win64 a část jenom Win32. Originální TPanel je Win32+Win64, ComponentPlatformsAttribute definuji a stejně není komponenta označena jako Win64. Chápu, že pro design-time vývoj je nutná varianta Win32 (kvůli IDE), ale když přepnu target na Win64, pak komponentu nemohu použít.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1199
  • Karma: 51
    • Verze Delphi: 10.3
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #4 kdy: 01-04-2021, 21:59:41 »
Zkusil jsem to u té své komponenty.

Ve zdrojáku:
Kód: Delphi [Vybrat]
  1. type [ComponentPlatformsAttribute(pfidWindows)]
  2.      tBarva = class(TPanel)
  3.  

Shift+F9 - IDE buď padá s Access Violation a je potřeba ho odstřelit, nebo po ohlášení Access Violation spadne samo. Možná těžce nese, že má ten .bpl soubor v tu chvíli vlastně načtený, a měl jsem ho přes Component, Install packages odstranit pomocí Remove.

Místo toho jsem s vypnutým IDE zkompiloval z příkazové řádky:
Kód: Delphi [Vybrat]
  1. "%FrameworkDir%\msbuild.exe" "%Home%\SPW\SpwKomponenty\Delphi%HVerze%\SpwKomponenty.dproj" /target:%Targets% /p:Config="Release" /p:Platform="Win32" /p:DCC_BuildAllUnits=true /p:DCC_DcuOutput="%PomSlozka%\DCU" /l:FileLogger,Microsoft.Build.Engine;logfile="%PomSlozka%\Logs-Komponenty.txt"
  2. if %ERRORLEVEL% NEQ 0 goto CHYBA
  3. "%FrameworkDir%\msbuild.exe" "%Home%\SPW\SpwKomponenty\Delphi%HVerze%\SpwKomponenty.dproj" /target:%Targets% /p:Config="Release" /p:Platform="Win64" /p:DCC_BuildAllUnits=true /p:DCC_DcuOutput="%PomSlozka%\DCU64" /l:FileLogger,Microsoft.Build.Engine;logfile="%PomSlozka%\Logs-Komponenty.txt"
  4. if %ERRORLEVEL% NEQ 0 goto CHYBA
  5. rem Design time
  6. "%FrameworkDir%\msbuild.exe" "%Home%\SPW\SpwKomponenty\Delphi%HVerze%\SpwKomponentyDesign.dproj" /target:%Targets% /p:Config="Release" /p:Platform="Win32" /p:DCC_BuildAllUnits=true /p:DCC_DcuOutput="%PomSlozka%\DCU" /l:FileLogger,Microsoft.Build.Engine;logfile="%PomSlozka%\Logs-Komponenty.txt"
  7.  

Vznikne mj. soubor C:\Users\Public\Documents\Embarcadero\Studio\21.0\Bpl\SpwKomponentyDesign270.bpl

V IDE pak Component, Install packages, Add, tenhle soubor. Teď už nabízí Win32 i Win64.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #5 kdy: 01-04-2021, 22:12:07 »
nutno napsat před registrované komponenty
(definovat DXE2UP pro překladače větší než XE)

Kód: Delphi [Vybrat]
  1.   {$IFDEF DXE2UP}
  2.   [ComponentPlatformsAttribute(pidWin32 or pidWin64)]
  3.   {$ENDIF}




pak to bude funkční

Offline paja666

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: 10.4.2 Sydney
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #6 kdy: 01-04-2021, 22:36:05 »
  [ComponentPlatformsAttribute(pfidWindows)]
  TG3Panel = class(TCustomPanel)

nutno napsat před registrované komponenty
(definovat DXE2UP pro překladače větší než XE)

Kód: Delphi [Vybrat]
  1.   {$IFDEF DXE2UP}
  2.   [ComponentPlatformsAttribute(pidWin32 or pidWin64)]
  3.   {$ENDIF}

To mám definováno, psal jsem to hned v prvním příspěvku (pfidWindows = pidWin32 or pidWin64). Mám pouze D10.4.2, takže DXE2UP není potřeba.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #7 kdy: 02-04-2021, 11:27:23 »
Mám podobného problematického potomka z TPanel, který se odmítá nechat přidat na form v 64-bit aplikaci, ač je správně označený, ale je to spíš nějaký formální problém v návrhu komponentu. Ale např. v RxLibray s tím problém nemám, tam je extra panel s gradientem.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #8 kdy: 02-04-2021, 11:52:38 »
Muzes zkusit nainstalovat balicek z prilohy? Je to naslednik CustomPanel a nabizi se mi i pro Win64.
Embarcadero MVP - Czech republic

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #9 kdy: 02-04-2021, 13:14:34 »
v XE8 to funguje, ale musím udělat náhradu (pfidWindows = pidWin32 or pidWin64) neb pfidWindows XE8 nezná

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2869
  • Karma: 106
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #10 kdy: 02-04-2021, 13:22:34 »
v XE8 to funguje, ale musím udělat náhradu (pfidWindows = pidWin32 or pidWin64) neb pfidWindows XE8 nezná

Hmm, a zkousel to i s dproj nebo bez?

Ja si myslim, ze je to neco v dproj, co je nastavene (mozna VCL). Ja jsem proste normalne zalozil balicek a novou komponentu. Podezrivam
Kód: Delphi [Vybrat]
  1. <FrameworkType>VCL</FrameworkType>
  2.  
Embarcadero MVP - Czech republic

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #11 kdy: 02-04-2021, 14:23:29 »
Provedl jsem jenom takový pseudo statistický průzkum, mám tu asi na 10000 dproj souborů a u všech, pocházejících z neunicode verzí či nižších než 2010, toto není. Mám na pecku jen Delphi 2007 a XE8, takže nemůžu exaktně chování vyzkoušet přes XE2 dolů.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1042
  • Karma: 29
    • Verze Delphi: XE8, Seattle
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #12 kdy: 02-04-2021, 14:27:51 »
Předpokládám, že implicitně je snad všechno VCL, a jen od XE2 může být framework i FMX.
Pro konzolové aplikace bez VCL tam nebude vyplněno nic?

Offline paja666

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: 10.4.2 Sydney
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #13 kdy: 06-04-2021, 07:00:10 »
Muzes zkusit nainstalovat balicek z prilohy? Je to naslednik CustomPanel a nabizi se mi i pro Win64.

Balíček z přílohy se nainstaluje a ukazuje mi obě platformy (Win32 i Win64) :o

Offline paja666

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: 10.4.2 Sydney
Re:Tvorba komponent i pro 64bit platformu
« Odpověď #14 kdy: 06-04-2021, 07:56:23 »
Excellent
Rated 1 time
Tak už mi to funguje správně. Chyba byla nakonec v tom, že někde mezi množstvím hintů cizích komponent mi zanikl hint k atributům. Neměl jsem v Uses System.Classes a v případě atributů je to pouze upozornění na neexistující konstantu.
« Poslední změna: 06-04-2021, 07:59:47 od paja666 »