![]() |
Delphi-Version: 2010
Klassen auflisten und Eigenschaften auslesen?
Moin !
Angenommen ich habe 3 Klassen in meiner Anwendung: TProject TProject_Text TProject_RTF TProject_Text & TProject_RTF sind von TProject abgeleitet. Nun würde ich gerne dynamisch eine Liste aufbauen können und zwar mit allen Klassen die von TProject abgeleitet sind. Der User würde dann eine Auswahl bekommen was er für ein Projekt erstellen mag. Da aber TProject_Text & TProject_RTF für einen User belanglose Namen sind wäre es gut wenn man Klasseneigenschaften definieren könnte. Als Beispiel ein einfacher String der für den User aussagekräftiger ist wie z.B. TProject_Text > "Projekt Eintrag für normalen Text". Ich habe es mal mit RegisterClass und FindClass versucht. Leider klappt das RegisterClass schon nicht. "[DCC Fehler] DeviceRoot.pas(152): E2010 Inkompatible Typen: 'TPersistentClass' und 'Class reference'" Müsste ich dann alle Klassen von TPersistent ableiten? Also anstatt
Delphi-Quellcode:
das
type TInputDevice = class
Delphi-Quellcode:
Ich habe hier
type TInputDevice = class(TPersistent)
![]() |
AW: Klassen auflisten und Eigenschaften auslesen?
Moin !
Ich glaube ich beantwrote mir das mal selber. Delphi hat ja neue RTTI Funktionen die nun auch Attribute enthalten können. :-D Beispiel:
Delphi-Quellcode:
Ich glaube das macht genau das was ich suche 8-)
[Table('CONTACTS')]
TContact = class(TStorable) private [FieldName('NAME')] FName: string; ... |
AW: Klassen auflisten und Eigenschaften auslesen?
![]() |
AW: Klassen auflisten und Eigenschaften auslesen?
Hallo Uwe,
herzlichsten Dank ! :thumb: Das war noch die Methdode zum Glück :-D Nun kann ich alle Klassen auflisten die von einer Basisklasse abgeleitet sind, kann die Klasse komplett zerlegen dank RTTI und kann auch noch die Klasse mit Attributen versehen was für mich recht wichtig ist. An dieser Stelle auch noch ein Danke an Daniel für sein super RTTI 2010 Video !! :thumb: |
AW: Klassen auflisten und Eigenschaften auslesen?
@Uwe:
Delphi-Quellcode:
Eine Frage habe ich doch noch ... Wenn ich nun die Klasse gefunden habe, wie kann ich dann eine Instanz davon erzeugen?
procedure TForm1.Button2Click(Sender: TObject);
var aClass : TClass; context : TRttiContext; types : TArray<TRttiType>; aType : TRttiType; Test : TUser; begin context := TRttiContext.Create; types := context.GetTypes; for aType in types do begin if aType.TypeKind = tkClass then begin aClass := aType.AsInstance.MetaclassType; if aClass.InheritsFrom(TUser) then begin Memo.Lines.Add(aClass.ClassName); Test := aClass.???? end; end; end; end; Also in dem Beispiel ... Test := aClass.!??!?! |
AW: Klassen auflisten und Eigenschaften auslesen?
Hmm über einen TypeCast gehts nicht. Das führt zu einem Zugriffsfehler:
Inst : TUser; Inst := TUser(aClass).Create; :gruebel: |
AW: Klassen auflisten und Eigenschaften auslesen?
Zitat:
Delphi-Quellcode:
Test := aType.GetMethod('Create').Invoke(aClass, []).AsObject as TUser;
|
AW: Klassen auflisten und Eigenschaften auslesen?
Aha so geht das.
Ich danke :thumb: |
AW: Klassen auflisten und Eigenschaften auslesen?
Ich glaube in dem hier beschriebenen Fall ist es ungünstig die RTTI zu verwenden. Denn letztendlich will man in den wenigsten Fällen das alle verfügbaren Eigenschaften etc. dem Endanwender zur Verfügung stehen. Und spätestens wenn es mehrsprachig werden soll ist es nicht mit einem einzigen Property getan sondern man kommt besser die Klasse gleich richtig zu implementieren so das sich jeder Nachfahre (wie bei TGraphic und TImage) selbst registriert und somit auch ausgelesen werden kann was verfügbar ist.
|
AW: Klassen auflisten und Eigenschaften auslesen?
Moin !
Zitat:
Es geht nur um das Handling "intern". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz