![]() |
Re: Propertys einer Componente für eine Klasse mittels RTTI
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 |
Re: Propertys einer Componente für eine Klasse mittels RTTI
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 :nerd: ) Achso :oops: ... dachte irgendwie, der findet alle Persistent-Klassen (TPersistent und Nachfahre) |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Zitat:
Gruß oki |
Re: Propertys einer Componente für eine Klasse mittels RTTI
hab grad
![]() jetzt ist der Code etwas kürzer und übersichtlicher:
Delphi-Quellcode:
und noch eine ganz Kurze/Übersichtliche ohne vorreservieren des Arrays:
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;
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 :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 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