![]() |
Propertys einer Componente für eine Klasse mittels RTTI
Hi,
kleines Problem. Ich kann die Propertys meiner Komponente mittels RTTI-Funktion GetPropList ermitteln. Dabei übergebe ich die Instanz meines Objectes sowie eine PropList und bekomme alle published Propertys zurückgeliefert. Jetzt möchte ich aber nur die Propertys haben, die in einer bestimmten Basisklasse enthalten sind. Hier mal als Beispiel:
Delphi-Quellcode:
Also an der Stelle nur Prop1.
TCustomClass = class(TComponent)
published property Prop1; end; TBaseClass = class(TCustomClass) published property Prop2; end; TExpertClass = class(TBaseClass) published property Prop3; end; ..... var MyClass : TExpertClass; ..... MyClass := TExpertClass.Create(nil); // alle Propertys für MyClass, die in TCustomClass enthalten sind auflisten ?????????? Einer ne Idee? Würd mich sehr freuen. Bei GetPropInfo kann eine Klassentyp übergeben werden. Was das dann bringt ist mir noch nicht so richtig klar, leider geht das nicht mit GetPropList. Ich hab auch irgentwie das Gefühl, das ich über GetTypeInfos da ran komme. Einen richtigen Plan hab ich aber nicht. Schon mal Dank für eure Hilfe, Gruß oki |
Re: Propertys einer Componente für eine Klasse mittels RTTI
im Notfall alle Properties ermitteln,
das Ganze nochmals bei der Parent-Klasse (wenn eine existiert) und am Ende alles in der Parent-Klasse Enthaltene aus der andere Liste entfernen. |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Also ein TempObj der geforderten Klasse erstellen, die Props lesen, das TempObj frei geben und diese Propliste auf mein Objekt anwenden?
Die Idee ist mir auch schon gekommen, fand ich nur nicht so elegant. Dachte eher ich hab eine Bildungslücke (ok, hab ich sicher :mrgreen: ) und es gibt einen Weg, wie ich zum Lesen der PropList eine Klasse angeben kann. Gruß oki |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Gehts vielleicht auch so?
Delphi-Quellcode:
Gruß oki
var PropList : PPropList;
PropCount : Integer; AClass : TClass; begin AClass := GetClass('TCustomClass'); if Assigned(AClass) then PropCount := GetPropList(AClass.ClassInfo, PropList); end; end; |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Boahh,
hat geklappt. Bin beeindrukt. Auch noch mal Dank an himitsu. Gruß oki |
Re: Propertys einer Componente für eine Klasse mittels RTTI
wenn das geht, dann sollte das auch so gehn?
Delphi-Quellcode:
var PropList : PPropList;
AClass : TClass; begin AClass := TCustomClass; PropCount := GetPropList(AClass.ClassInfo, PropList); end; // bzw. var PropList : PPropList; begin PropCount := GetPropList(TCustomClass.ClassInfo, PropList); end; |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Klar, sorry mein Fehler. Ich hab zu diesem Zeitpunkt nur den Namen der Klasse. Somit muss ich sie erst holen. Konntest du aber nicht wissen, da ich keinen Funktionskopf mitgeliefert hatte.
Passt aber. Dank und Gruß oki |
Re: Propertys einer Componente für eine Klasse mittels RTTI
ochso :stupid:
und was liefert GetPropList nun alles? |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Zitat:
Gruß oki |
Re: Propertys einer Componente für eine Klasse mittels RTTI
Delphi-Quellcode:
getestet und läuft :angel: ... nur GetClass findet die Klasse nicht :gruebel:
Uses Types, TypInfo;
Function GetClassPropList(C: TClass): TStringDynArray; Var L, L2: PPropList; i, i2, i3, i4: Integer; Begin L := nil; L2 := nil; i := 0; i2 := 0; Try If Assigned(C) Then Begin i := GetPropList(C.ClassInfo, L); C := C.ClassParent; If Assigned(C) Then i2 := GetPropList(C.ClassInfo, L2); End; For i3 := 0 to i - 1 do For i4 := 0 to i2 - 1 do If Assigned(L[i3]) and (L[i3].Name = L2[i4].Name) Then L[i3] := nil; i4 := 0; For i3 := 0 to i - 1 do If Assigned(L[i3]) Then Inc(i4); SetLength(Result, i4); i4 := 0; For i3 := 0 to i - 1 do If Assigned(L[i3]) Then Begin Result[i4] := L[i3].Name; Inc(i4); End; Finally If Assigned(L) Then FreeMem(L); If Assigned(L2) Then FreeMem(L2); End; End; Var C: TClass; R: TStringDynArray; i: Integer; Begin C := TScrollingWinControl; //C := GetClass('TScrollingWinControl'); R := GetClassPropList(C); For i := 0 to High(R) do Memo1.Lines.Add(R[i]); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 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