AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Propertys einer Componente für eine Klasse mittels RTTI
Thema durchsuchen
Ansicht
Themen-Optionen

Propertys einer Componente für eine Klasse mittels RTTI

Ein Thema von oki · begonnen am 26. Mär 2009 · letzter Beitrag vom 27. Mär 2009
Antwort Antwort
Seite 2 von 2     12   
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Propertys einer Componente für eine Klasse mittels RTTI

  Alt 27. Mär 2009, 06:58
Moin himitsu,

mit dem Lesen der Propertys hatte ich kein Problem. Es ging wirklich nur um den Fall, dass ich nicht alle Propertys der Klasse haben wollte, sondern nur die einer ausgewählten Vorfahrenklasse.

GetClass findet nur registrierte Klassen. Erstellst du eine eigene Klasse, auch als Nachfahre einer registrierten, so muss diese mit RegisterClass registriert werden. Dann findet GetClass diese auch.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Propertys einer Componente für eine Klasse mittels RTTI

  Alt 27. Mär 2009, 09:06
TPropInfo enhält zumindestens keine Info, wozu es gehört.
Man könnte hier höchstens nachsehn an welcher Stelle es liegt (wohin der jeweilige Pointer in PPropList zeigt), aber ich glaub es wäre keine ganz sichere Methode, anhand deren Position diese zuordnen zu wollen,
obwohl ja die List der Methoden der Klasse zusammenstehen sollten, in der jeweiligen Klassendefinition.

Nja, so läuft es doch auch.
(PS: ich Idiot hatte beim Testen TForm1 verwendet und mich gewundert, daß dort die Ergebnisliste leer war )

Achso ... dachte irgendwie, der findet alle Persistent-Klassen (TPersistent und Nachfahre)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Propertys einer Componente für eine Klasse mittels RTTI

  Alt 27. Mär 2009, 09:25
Zitat:
(PS: ich Idiot hatte beim Testen TForm1 verwendet und mich gewundert, daß dort die Ergebnisliste leer war Nerd )

Achso Embarassed ... dachte irgendwie, der findet alle Persistent-Klassen (TPersistent und Nachfahre)
Joop, den hab ich auch schon hinter mir. Willkommen im Club

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Propertys einer Componente für eine Klasse mittels RTTI

  Alt 27. Mär 2009, 13:43
hab grad dort drüben noch was Nettes gefunden...

jetzt ist der Code etwas kürzer und übersichtlicher:
Delphi-Quellcode:
Uses Types, TypInfo;

Function GetClassPropList(C: TClass): TStringDynArray;
  Var L: PPropList;
    i, i2, i3: Integer;

  Begin
    Result := nil;
    If not Assigned(C) Then Exit;
    L := nil;
    i := 0;
    Try
      i := GetPropList(C.ClassInfo, L);
      C := C.ClassParent;
      For i2 := i - 1 downto 0 do
        If IsPublishedProp(C, L[i2].Name) Then L[i2] := nil;
      i3 := 0;
      For i2 := i - 1 downto 0 do
        If Assigned(L[i2]) Then Inc(i3);
      SetLength(Result, i3);
      For i2 := i - 1 downto 0 do
        If Assigned(L[i2]) Then Begin
          Dec(i3);
          Result[i3] := L[i2].Name;
        End;
    Finally
      If Assigned(L) Then FreeMem(L);
    End;
  End;
und noch eine ganz Kurze/Übersichtliche ohne vorreservieren des Arrays:
Delphi-Quellcode:
Function GetClassPropList(C: TClass): TStringDynArray;
  Var L: PPropList;
    i, i2, i3: Integer;

  Begin
    Result := nil;
    If not Assigned(C) Then Exit;
    L := nil;
    Try
      i := GetPropList(C.ClassInfo, L);
      For i2 := 0 to i - 1 do
        If not IsPublishedProp(C.ClassParent, L[i2].Name) Then Begin
          i3 := Length(Result);
          SetLength(Result, i3 + 1);
          Result[i3] := L[i2].Name;
        End;
    Finally
      If Assigned(L) Then FreeMem(L);
    End;
  End;


Aber ohne nachzusehn, würd ich einfach mal behaupten, die alte/allererste Funktion ist dagegen immerhin schneller
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:27 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