AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RTTI: Verschachtelte Klassen auslesen

Ein Thema von s.h.a.r.k · begonnen am 29. Aug 2011 · letzter Beitrag vom 29. Aug 2011
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

RTTI: Verschachtelte Klassen auslesen

  Alt 29. Aug 2011, 11:47
Delphi-Version: 5
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

AW: RTTI: Verschachtelte Klassen auslesen

  Alt 29. Aug 2011, 14:15
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 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
    ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: RTTI: Verschachtelte Klassen auslesen

  Alt 29. Aug 2011, 15:00
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: RTTI: Verschachtelte Klassen auslesen

  Alt 29. Aug 2011, 17:19
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: RTTI: Verschachtelte Klassen auslesen

  Alt 29. Aug 2011, 18:59
Ich weiß, ein schöner Test sieht anders aus, aber das gewünschte Ergebnis ist vorhanden
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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