hi,
die GetComponentProps-funktion ist doch gar ncht so lang...und da mache ich genau das, was du versuchst, in eine KLasse zu kapseln.
GetComponentProps(AComponent:string;List:TStrings; AppendSubclasses:boolean);
aComponent => Klassenname als String z.b. 'TEdit'
AppendSubclasses heist einfach, dass bei Unterstrukturen wie (z.b. TFont) gleich die Unterwerte aufgelöst werden.also anstatt einfach nur TFont steht halt dann in der liste TFont.Sytle,TFont.Color,... und entsprechend das TypeObject dazu (siehe nachfolgende info).
List: ne einfache stringlist die später alle eigenschaften als string enthält und als angehängtes Object die
rtti-Informationen (Name [für klassen interessant] und Kind [tk*])...das Object nennt sich da halt einfach TTypeObject und ist so deklariert (classes_u.pas):
Delphi-Quellcode:
TTypeObject = class
private
FPropKind:TTypeKind;
FTypeName:String;
FCompType: PTypeInfo;
public
procedure Assign(Src:TTypeObject);
property PropKind:TTypeKind read FPropKind write FPropKind;
property TypeName:String read FTypeName write FTypeName;
property CompType: PTypeInfo read FCompType write FCompType;
end;
der
OI im DFMEdit liest diese liste aus (inspector_u.pas:GetPropValues),kopiert diese
rtti-Infos in ein neues Object (TCellOptions.TypeObject) und zeigt anhand des Kind in dem TTypeObject den entsprechenden Editor (TEdit,TCombobox,TChecklistbox, etc) an (inspector_u.pas:StringGrid1SelectCell).
TCellOptions enthält zu den
RTTI-Infos noch Infos, ob ein property direkt geändert werden darf (bei methoden und klassenproperties unerwünscht
).
ich hoffe das machts etwas klarer...ansonsten ist die funktion doch net so lang
an die speziellen Property-editoren (TPicture,TTreenodes,...) kommst du nicht ran, da diese nur in den Entwurfszeitpackes (also nur innerhalb der delphi-
IDE) vorhanden sind.da musst du dir was eigenes basteln. die Treenode-Struktur (Binärdaten) hab ich schon entschlüsselt, TPicture noch nicht ganz und bei TImagelist, hab ich noch keinen Weg gefunden, eine maske zu erstellen. bzw. die vorhandene Maske anzuwenden. die Dokumentation ist auch sehr spährlich.
versteh nicht ganz, warum du das auf
XML stellen willst...dfm ist doch schon ein passendes Format.und ich habe für D3 noch keine funktionierende
XML-Implementation gefunden.
ansonsten kannst du mir ja mal den code schicken, und ich schau mal, ob ich den fehler finde.
eine Sache, die mir gerade so ins auge fällt:
Delphi-Quellcode:
property MethodKind: TTypeKind;
property MethodName: TStringType;
du brauchst private variablen, um properties speichern zu können...hat aber nix mit
rtti zu tun, sondern mit normalem Klassendesign.
so sollte das aussehen...(kannst statt string auch deine eigene Definition nehmen (TStringType)):
Delphi-Quellcode:
type
cls=class(basisclass)
FKind:TTypeKind;
FName:
string;
published
property MethodKind: TTypeKind
read fKind
write fKind;
property MethodName:
string read fName
write fName;
HTH Frank