![]() |
Delphi-Version: 5
RTTI: Verschachtelte Klassen auslesen
Tag zusammen,
gibt es eine Möglichkeit via RTTI verschachtelte Klassen (-> ![]()
Delphi-Quellcode:
Ich möchte hier die (direkten) "eingebetteten" Klassen auslesen und damit eben Dinge anstellen.
TParent = class
public type TChildA = class end; TChildB = class end; public // Reads TChildA and TChildB from TParent procedure GetNestedTypes(); |
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:
suchen, welche sich in der selben Unit befinden, wie deine TParent,
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 ... |
AW: RTTI: Verschachtelte Klassen auslesen
Habe deine vorgeschlagene Lösung gerade auch gefunden, und zwar
![]() |
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. |
AW: RTTI: Verschachtelte Klassen auslesen
Ich weiß, ein schöner Test sieht anders aus, aber das gewünschte Ergebnis ist vorhanden :stupid:
Delphi-Quellcode:
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.
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 |
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