Autor |
Beitrag |
mindtrap
      
Beiträge: 62
|
Verfasst: Do 30.06.11 14:17
Hallo,
ich stehe vor einem kleinen Problem bezüglich nicht registrierbarer Klassen. Gemeint sind jene Klassen, die nicht von TPersistent abgeleitet wurden und entsprechend auch nicht mit RegisterClass() registriert werden können. Wenn eine Klasse aber nicht registriert wird, kann man sie natürlich auch nicht die Klassenreferenz mittels GetClass(<KlassenName>) abrufen.
Eine andere Variante ist die Vorgehensweise über die Rtti. Mittels TRttiContext und der Methode FindType(<ModuleName.KlassenName>) können auch Klassen ermittelt werden.
Leider gelingt mir das nur, wenn die Klasse mindestens einmal schon vorher erzeugt wurde, ansonsten wird die Klasse nicht gefunden.
Umgehen kann ich das indem ich im Initialization der Unit die Klassen erzeuge und sofort wieder freigebe. (Ist aber auch keine Lösung.)
Was ich auch nicht machen möchte, ist mir ein eigenes RegisterClass basteln.
So, nun komme ich zur Preisfrage. Welche Möglichkeiten bleiben mir noch? Kann ich die Klassendefinitionen doch irgendwie zur Laufzeit ermitteln ohne mir einen Ast abbrechen zu müssen? Ich bin für jeden verrückten Vorschlag offen.
Danke
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
mindtrap 
      
Beiträge: 62
|
Verfasst: Fr 01.07.11 15:16
|
|
guinnes
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Fr 01.07.11 16:05
Ich denke, daß wenn du die Klasse nicht registrierst und die Klasse nicht mindestens einmal erzeugst, wird Klasse vom Linker rausgeworfen und existiert demzufolge nicht in der Exe
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 01.07.11 16:36
Vielleicht reicht es auch schon in initialization eine Klassenmethode der Klasse aufzurufen. Die muss ja nichts tun, denn damit der Aufruf klappt, muss der Linker ja die Klasse mit in die Exe linken.
|
|
mindtrap 
      
Beiträge: 62
|
Verfasst: Di 05.07.11 10:32
Dass die Klasse vom Linker entfernt wird, halte ich für sehr unwahrscheinlich.
Wenn man eine Klasse mit RegisterClass bzw. RegisterClasses registriert, wird sie auch nicht erst erzeugt, sie wird lediglich in
eine Liste eingepflegt.
Das mit der Klassenmethode versuch ich mal, auch wenn es nicht wirklich eine schöne Lösung ist.
Danke an euch beide.
|
|
guinnes
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Di 05.07.11 10:38
mindtrap hat folgendes geschrieben : | Dass die Klasse vom Linker entfernt wird, halte ich für sehr unwahrscheinlich.
Wenn man eine Klasse mit RegisterClass bzw. RegisterClasses registriert, wird sie auch nicht erst erzeugt, sie wird lediglich in eine Liste eingepflegt. |
und damit hat der Linker keinen Grund mehr, die Klasse rauszuwerfen
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 05.07.11 11:13
mindtrap hat folgendes geschrieben : | Dass die Klasse vom Linker entfernt wird, halte ich für sehr unwahrscheinlich.
Wenn man eine Klasse mit RegisterClass bzw. RegisterClasses registriert, wird sie auch nicht erst erzeugt, sie wird lediglich in
eine Liste eingepflegt. |
Es geht auch nicht um das was RegisterClass macht, sondern darum, dass du mit diesem Aufruf die Klasse verwendest. Das ist dann für den Linker das Signal diese doch besser einzubinden, das wäre schon logisch.
Wobei es auch durchaus sein kann, dass die Klasse trotzdem da ist, aber vielleicht werden einfach keine RTTI-Informationen generiert.
Ich mache so etwas auch nicht so wie du. Ich benutze eine Liste von Klassen, bei der sich die Klassen anmelden. Diese Liste wird von einem Klassenkonstruktor erstellt und ist über eine Klasseneigenschaft erreichbar. Die Klasse selbst haben eine Klassenmethode, anhand derer geprüft werden kann, welche die passende für die Aufgabe ist (z.B. die richtige für eine Dateierweiterung etc.).
Auf diese Weise läuft das ganze sehr stabil.
|
|
mindtrap 
      
Beiträge: 62
|
Verfasst: Di 05.07.11 12:59
Ja, stimmt. Sobald die Klasse in irgendeiner Form und Weise verwendet wird, ist sie mittels RttiContext.FindType verfügbar.
D.h. der Linker entfernt die Klasse doch. Mein Fehler.
Das macht die Sache aber im Moment nicht besser für mich.
D.h. ich werde wohl doch eine eigene Klassenliste bauen müssen, die auch Generics unterstützt oder
weiß jemand, ob man ggf. mittels Compilerschalter das Verhalten des Linkers f. eine Klasse übersteuern kann?
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 05.07.11 13:22
mindtrap hat folgendes geschrieben : | D.h. ich werde wohl doch eine eigene Klassenliste bauen müssen, die auch Generics unterstützt |
Was spricht gegen eine normale TList<T>? Ich glaube ich hatte einfach die genommen.
|
|
mindtrap 
      
Beiträge: 62
|
Verfasst: Di 05.07.11 13:24
Garnichts, ich hab auch TList<T> nicht ausgeschlossen sondern schlicht gemeint, dass ich dann selbst eine Liste erstellen muss
und keine Lib von Delphi, die das schon kann, verwenden kann. 
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 05.07.11 13:51
Ach so meintest du das, klar.
Wobei eine solche eigene Liste auch in einer eigenen Klasse abgeleitet natürlich mehr Funktionen bieten kann. Nämlich z.B. eine Factory-Funktion als Klassenmethode z.B., zudem musst du einen Klassennamen nicht kennen, sondern kannst anhand anderer Kriterien die richtige Klasse finden.
|
|
|