[Delphi] Class met z'n naam opzoeken

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik ben nu op een punt gekomen waar in met behulp van een classname (een string dus) de class zelf moet opzoeken, en dus een TClass terug wil hebben. Het gaat in mijn geval om classes die van allemaal van TComponent zijn afgeleid (niet direct, maar toch).

Nou las ik in de help dat je GetClass/FindClass kunt gebruiken hiervoor, maar dan moeten die componenten eerst geregistreerd worden met RegisterClass. En zoals verwacht krijg ik nil terug, wanneer ik...
Delphi:
1
GetClass(TButton.ClassName);
...opvraag. En met RegisterClass zou het de boel praktisch weer zo statisch maken als het was.

Nou vroeg ik me af of er misschien iets te doen is met RegisterComponents, die voor ieder component in de Register procedure staat in het betreffende unit. Delphi zelf kan z'n componenten wel bij naam opzoeken (want hij laadt de DFM in), dus het lijkt me dat het in runtime ook moet kunnen?

日本!🎌


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 27-05 23:18

Delphi32

Heading for the gates of Eden

RegisterComponent(s) is bedoeld om components in de IDE te registreren, en heeft weinig te maken met RegisterClass(es). De eerste wordt alleen uitgevoerd als je een package in de IDE installeert, de tweede elke keer dat je je app start.
Je ontkomt er dus niet aan om je classes te registreren. Ik zie ook niet zo erg in waarom dat te statisch zou zijn (maar daar heb je vast een goeie reden voor) :)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Daar heb ik zeker een goeie reden voor. Nu include nu gewoon alle units waaruit ik componenten nodig heb, zonder dat de applicatie weet welke componenten dat zijn. Als ik ze allemaal moet gaan registreren, moet ik dus alsnog alle units met de hand afgaan...

日本!🎌


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 26-05 11:18

alienfruit

the alien you never expected

Hoezo? Je kunt toch die RegisterClass methode in de initialization section van die units plaatsen :?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Had ik misschien eerder moeten zeggen, maar het zijn 3rd party units met 3rd party componenten. Die kan ik dus niet gaan veranderen... bovendien heb ik het alléén voor deze applicatie nodig. De RegisterClass overhead hoeft niet in alle andere apps die die unit ook gebruiken ;)

[ Voor 35% gewijzigd door _Thanatos_ op 23-12-2003 16:40 ]

日本!🎌


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 26-05 11:18

alienfruit

the alien you never expected

Doe je het via een {$IFDEF} ;) en dan die in je Project Settings setten :)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Als ik Classes.RegisterComponentsProc op iets zinnigs zet, zal RegisterComponents met mijn eigen procedure uitgevoerd kunnen worden... De andere Register* procedures zullen nog wel een exception opgooien, maar die zijn op te vangen.

Dus volgens mij het enige dat ik nodig heb is een manier om alle gebruikte units op te vragen en de Register procedure aan te roepen...

日本!🎌


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 27-05 23:18

Delphi32

Heading for the gates of Eden

Maar als het goed is worden de units die RegisterComponents bevatten van jouw 3rd party stuff, helemaal niet meegeleverd in jouw release. Die 'horen' in een design time package thuis, en meestal mag je dat niet uitleveren.
Ik weet dat er component packs zijn waar de Register procedure gewoon in de component unit zit, maar *eigenlijk* is dat niet de bedoeling...
Maak gewoon 1 unit die al die classes registreert en die bij opstarten (initialization of zo) verwerkt wordt, lijkt mij het simpelst.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Mja, dat zat ik me net ook te bedenken... ik had dan ook als voorbeeld een componentje waar 1 methode aan overridden is, dus daarvoor heb je geen apart unit/package voor de Register procedure nodig :)

Maargoed, tot ik een oplossing gevonden heb, moet het maar op de 'statische' manier.

日本!🎌


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 26-05 11:18

alienfruit

the alien you never expected

Naja, er is geen andere manier dan de RegisterClass functie... Anders vind je het gewoon niet. Of je moet packages gebruiken e.d. forms in opslaan met die componenten etc.
Pagina: 1