Forum Delphi.cz

Delphi => Obecné => Téma založeno: paja666 01-04-2021, 16:01:07

Název: Tvorba komponent i pro 64bit platformu
Přispěvatel: paja666 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.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: vandrovnik 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.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: JaroB 01-04-2021, 20:48:52
stačilo by tohle?
http://docwiki.embarcadero.com/RADStudio/Sydney/en/64-bit_Windows_Application_Development#Considerations_for_64-bit_Applications (http://docwiki.embarcadero.com/RADStudio/Sydney/en/64-bit_Windows_Application_Development#Considerations_for_64-bit_Applications)
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: paja666 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 (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.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: vandrovnik 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.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: JaroB 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í
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: paja666 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.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: JaroB 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.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: Radek Červinka 02-04-2021, 11:52:38
Muzes zkusit nainstalovat balicek z prilohy? Je to naslednik CustomPanel a nabizi se mi i pro Win64.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: JaroB 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á
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: Radek Červinka 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.  
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: JaroB 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ů.
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: JaroB 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?
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: paja666 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
Název: Re:Tvorba komponent i pro 64bit platformu
Přispěvatel: paja666 06-04-2021, 07:56:23
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.