Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen auflisten und Eigenschaften auslesen? (https://www.delphipraxis.net/154596-klassen-auflisten-und-eigenschaften-auslesen.html)

moelski 17. Sep 2010 03:29

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:
type TInputDevice = class
das
Delphi-Quellcode:
type TInputDevice = class(TPersistent)
Ich habe hier http://delphi.about.com/library/weekly/aa080905a.htm was gefunden was in etwa in die Richtung geht. Allerdings werden dort die Klassen nicht ermittelt sondern sind fest in eine ListBox eingetragen. :cry:

moelski 17. Sep 2010 06:56

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:
[Table('CONTACTS')]
TContact = class(TStorable)
private
[FieldName('NAME')]
FName: string;
...
Ich glaube das macht genau das was ich suche 8-)

Uwe Raabe 17. Sep 2010 07:25

AW: Klassen auflisten und Eigenschaften auslesen?
 
Hier habe ich mal ein Beispiel gezeigt, wie man alle Form-Klassen auflisten kann.

moelski 17. Sep 2010 08:21

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:

moelski 17. Sep 2010 09:42

AW: Klassen auflisten und Eigenschaften auslesen?
 
@Uwe:

Delphi-Quellcode:
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;
Eine Frage habe ich doch noch ... Wenn ich nun die Klasse gefunden habe, wie kann ich dann eine Instanz davon erzeugen?

Also in dem Beispiel ... Test := aClass.!??!?!

moelski 17. Sep 2010 10:24

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:

Stevie 17. Sep 2010 10:51

AW: Klassen auflisten und Eigenschaften auslesen?
 
Zitat:

Zitat von moelski (Beitrag 1050244)
Eine Frage habe ich doch noch ... Wenn ich nun die Klasse gefunden habe, wie kann ich dann eine Instanz davon erzeugen?

Also in dem Beispiel ... Test := aClass.!??!?!

Mit Standard Constructor:
Delphi-Quellcode:
Test := aType.GetMethod('Create').Invoke(aClass, []).AsObject as TUser;

moelski 17. Sep 2010 10:58

AW: Klassen auflisten und Eigenschaften auslesen?
 
Aha so geht das.

Ich danke :thumb:

SirThornberry 17. Sep 2010 13:38

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.

moelski 17. Sep 2010 15:41

AW: Klassen auflisten und Eigenschaften auslesen?
 
Moin !

Zitat:

dem Endanwender zur Verfügung stehen
Habe mich da vermutlich faslch ausgedrückt ... Der Endanwender kliegt davon nichts zu sehen.

Es geht nur um das Handling "intern".


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz