Einzelnen Beitrag anzeigen

Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#15

Re: RTTI - Typinformation kommt nicht am Ziel an

  Alt 18. Mär 2009, 15:45
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
  Mit Zitat antworten Zitat