Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   RTTI: Verschachtelte Klassen auslesen (https://www.delphipraxis.net/162558-rtti-verschachtelte-klassen-auslesen.html)

s.h.a.r.k 29. Aug 2011 11:47

Delphi-Version: 5

RTTI: Verschachtelte Klassen auslesen
 
Tag zusammen,

gibt es eine Möglichkeit via RTTI verschachtelte Klassen (-> nested classes) auszulesen? Im speziellen geht es um folgendes Problem:
Delphi-Quellcode:
TParent = class
public type
  TChildA = class
  end;
  TChildB = class
  end;
public
  // Reads TChildA and TChildB from TParent
  procedure GetNestedTypes();
Ich möchte hier die (direkten) "eingebetteten" Klassen auslesen und damit eben Dinge anstellen.

himitsu 29. Aug 2011 14:15

AW: RTTI: Verschachtelte Klassen auslesen
 
Ich glaub nicht, aber du könntest dir alle RTTI-Klassen/-Typen auflisten lassen.
Mit solchen eingebetteten Typen und Konstanten hat man dort wohl so seine Problemchen.

Und dann nach
Delphi-Quellcode:
TParent.*
suchen, welche sich in der selben Unit befinden, wie deine TParent,
da deine Subklassen TParent.TChildA und TParent.TChildB heißen werden.


Delphi-Quellcode:
X = TParent

while ... do
  if StartsText(X.ClassName + '.', Found.ClassName) and (X.UnitName = Found.UnitName) then
    ...

s.h.a.r.k 29. Aug 2011 15:00

AW: RTTI: Verschachtelte Klassen auslesen
 
Habe deine vorgeschlagene Lösung gerade auch gefunden, und zwar hier. Ist zwar nicht unbedingt so toll, aber wenn ich mir da zu Beginn der Anwendung einen entsprechenden Baum bastle, dann ist das eine ausreichend gute Lösung für mich.

Stevie 29. Aug 2011 17:19

AW: RTTI: Verschachtelte Klassen auslesen
 
Soweit ich weiß, sind Informationen über genestete Typen (also z.B. wer der Parent Typ ist) nicht Bestandteil der RTTI. -> Feature Request ins QC eintragen.

Ich meine auch, dass je nach Sichtbarkeit gar keine RTTI erzeugt wird, da bin ich aber nicht sicher und müsste nachschauen.

s.h.a.r.k 29. Aug 2011 18:59

AW: RTTI: Verschachtelte Klassen auslesen
 
Ich weiß, ein schöner Test sieht anders aus, aber das gewünschte Ergebnis ist vorhanden :stupid:
Delphi-Quellcode:
type
  TTest = class
  strict private type TStrict = class end;
  strict private _Strict : TStrict;

  private type TOne = class end;
  private One : TOne;

  protected type TTwo = class end;
  protected Two : TTwo;

  public type TThree = class end;
  public Three : TThree;

  public type
    TNested = class
    public type TNestedNested = class end;
    public Nested : TNestedNested;
    end;

  public Nested : TNested;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  RC : TRttiContext;
  RT : TRttiType;
  T : TTest;
begin
  mmoLog.Clear();
  for RT in RC.GetTypes() do
    if (Pos(TTest.ClassName, RT.QualifiedName) > 0) then
      mmoLog.Lines.Add(RT.QualifiedName);

  T := TTest.Create();
  T.Free();
end;

// liefert:

Unit1.TTest.TStrict
Unit1.TTest.TOne
Unit1.TTest.TTwo
Unit1.TTest.TThree
Unit1.TTest.TNested.TNestedNested
Unit1.TTest.TNested
Unit1.TTest
Das Problem hierbei ist aber noch herauszufinden, welcher Teil von z.B. Unit1.TTest.TStrict ein Typ ist und welcher zur Unit gehört. Idee hierzu: den String nach und nach kürzen und via TRttiContext.FindType testen, ob der Typ gefunden wurde und ob dessen QualifiedName-Eigenschaft gleich dem übergebenen String-Parameter entspricht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:39 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