Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RTTI - Typinformation kommt nicht am Ziel an (https://www.delphipraxis.net/130963-rtti-typinformation-kommt-nicht-am-ziel.html)

I.A 16. Mär 2009 18:52


RTTI - Typinformation kommt nicht am Ziel an
 
Hallo!

Seit paar Tagen beschäftigt mich das Problem der Gewinnung von Laufzeittypinformation.
Mit dem folgenden Quelltext will ich die Eigenschaften einer übergebenen Klasse anzeigen.
Leider kommt im dafür vorgesehenen ValueListEditor, hier DebugInsp, keine Information an.

Sieht zufällig jemand, was ich falsch gemacht habe. Ich weiß nicht mehr weiter. Auch das Studium
der Unit TypInfo hilft mir nicht weiter. Ebenso wenig helfen andere Quelltexte, die Typinformation sammeln. Deshalb wär es schön, wenn ich meine eigene Version fehlerbereingen könnte. :gruebel:

Delphi-Quellcode:
var
  _Class: TObject;
  _Index: Integer;
  _TypeInf: PTypeInfo;
  _TypeDat: PTypeData;
  _PropList: PPropList;
  AProperties: TTrings;

begin
  AProperties := TStringList.Create;
  AClassAnchor := AClass; //AClass wurde an anderer Stelle instnatiiert
  if Assigned(FClassAnchor) then
  begin
    //Typinformation holen
    AClassTypeInfo := AClass.ClassInfo;
    AClassTypeData := GetTypeData(_TypeInf);
    try
      APropertyCount := AClassTypeData.PropCount;
      //getmem(_PropList, Sizeof(TPropInfo) * AClassTypeData.PropCount);
      //Hatte vorher GetPropinfos() verwendet. Da war getmem nötig. Funzt aber auch nicht
      if Assigned(_PropList) then
      GetPropList(AClass,_PropList);
      for _Index := 0 to AClassTypeData.PropCount-1 do
      AProperties.Add(TProperty.CreateClass(AClass.ClassType,_PropList[_Index]^.Name));
     
      Form1.OutputClassProperties(AClassAnchor: TObject);
    finally

   // freemem(_PropList, Sizeof(TPropInfo) * AClassTypeData.PropCount);
   // wenn freemem aufgerufen wird folgt EAccessviolation
    end;
  end;
end;


//Hier ist die AUsgabe der Typinformation codiert:
procedure TForm1.OutputClassProperties(AClass: TObject);
var
  Index: Integer;
begin
  ATypeInfo.ClassAnchor := AClass;
  for Index:=0 to ATypeInfo.PropertyCount - 1 do
  begin
    ATypeKind := ATypeInfo.PropTypeKind[Index];
    if ATypeKind <> tkMethod then
    begin
      case ATypeKind of
        tkInteger,
        tkString,tkWChar,tkLString,tkWString,tkInt64:
         begin

            //Hier will ich die Ausgabe als Eigenschaft |  Typ  realisieren
            DebugInsp.InsertRow(  //Debugisp ist ein ValueListEditor
               ATypeInfo.PropertyName[Index],
               ATypeInfo.PropertyType[Index].Name,
               true
            );
           
         end;
        tkFloat: ;
        tkEnumeration: ;
        tkSet: ;
        tkClass: ;
      end;
    end
    else
    begin
    end;
  end;
end;
Wer hat den entscheidenden Fingerzeig.

Die Unit ist mit {$TYPEINFO ON} übersetzt.

sirius 16. Mär 2009 19:26

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Wie sieht denn die Klasse aus, welche du anzeigen willst?

I.A 16. Mär 2009 19:29

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Hallo sirius,

Dake zuerst für die Hilfbereitschaft! :smile2: Die Klasse, die ich anzeigen will ist ein TMemo.

stoxx 17. Mär 2009 02:11

Re: RTTI - Typinformation kommt nicht am Ziel an
 
guck Dir dochmal die Klasse mit genauem Auge an :-)


ganz unten:
XML Serializer ...

http://www.dragonsoft.us/delphi_vcl.php

da steht alles drin, was Du brauchst :-)

wenn Du eine TMemo einfach mal genauso wie mit dem Delphi Original Inspektor bearbeiten willst, dann bietet sich

TJvInspector an .. oder auch die komponenten von TMS .. wobei man da noch paar Anpassungen vornehmen muss, damit die auch mit verschachtelten Komponentenstrukturen klar kommt ..




oder hier auch nochmal ...

http://www.delphipraxis.net/internal...148&highlight=

I.A 17. Mär 2009 09:15

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Zitat:

Zitat von stoxx
guck Dir dochmal die Klasse mit genauem Auge an :-)


ganz unten:
XML Serializer ...

http://www.dragonsoft.us/delphi_vcl.php

da steht alles drin, was Du brauchst :-)

wenn Du eine TMemo einfach mal genauso wie mit dem Delphi Original Inspektor bearbeiten willst, dann bietet sich

TJvInspector an .. oder auch die komponenten von TMS .. wobei man da noch paar Anpassungen vornehmen muss, damit die auch mit verschachtelten Komponentenstrukturen klar kommt ..




oder hier auch nochmal ...

http://www.delphipraxis.net/internal...148&highlight=

Hmm, erst mal danke, aaaaberrr, wie weise ich meine Klasse zu? Die Methode AssignTo ist protected.

Danach will ich ja die Klasseneigenschaften anzeigen. Mit welcher Methode oder Funktion/Prozedur muss ich da die erzeugte XML Datei auslesen?

Leider ist hier http://www.dragonsoft.us/delphi_vcl.php nur die Komponete ohne Doku.

So, wie ich das Demo bisher verstanden habe, das ich die XML Serialisierer Methoden aufrufen kann, als ob sie Bestandteil jeder Klasse wären. Ich habe aber in der kurzen Zeit des Reinguckens noch nicht verstanden, warum das geht? Kannst Du bitte etwas Licht in Dunkel bringen.

Mein Ziel ist, Eigenschaft, Typ und Wert anzeigen zu lassen. Zunächst egal wo.

stoxx 17. Mär 2009 10:20

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Zitat:

So, wie ich das Demo bisher verstanden habe, das ich die XML Serialisierer Methoden aufrufen kann, als ob sie Bestandteil jeder Klasse wären. Ich habe aber in der kurzen Zeit des Reinguckens noch nicht verstanden, warum das geht? Kannst Du bitte etwas Licht in Dunkel bringen.
das scheint nicht Dein Hauptinteresse zu sein, aber es geht über Class Helper ..


Zitat:

Hmm, erst mal danke, aaaaberrr, wie weise ich meine Klasse zu? Die Methode AssignTo ist protected.
Mein Ziel ist, Eigenschaft, Typ und Wert anzeigen zu lassen. Zunächst egal wo.
ja ... okay ..

also JEDI

http://jvcl.delphi-jedi.org/

dort den TJvInspector ..

und dann

Delphi-Quellcode:
begin
 inspectorMain.InspectObject := form1;
end;
dann wird das Form zum Editieren angezeigt, oder jede weitere beliebige Komponte und deren published Eigenschaften .. so wie in Delphi selbst auch ..

oder eben der RTTIinspector von TMS ...

I.A 17. Mär 2009 11:18

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Hallo stoxx,

danke erst mal für die zahlreichen Tipps, aber ich werde wohl doch bei dem XML Serialisierer bleiben. Hab das Demo gestartet, die Komponentendaten in die XML Datei gespeichert. Das Laden klappt im Demo auch. Das passt schon so. Einen Objektinspektor habe ich von Kasparsoft. Die aus der Xml Datei gelesenen Daten dort angezeigt zu kriegen, ist mein nächster Arbeitsschritt. Danke deshalb für den Xml Serialisierer.

Viellicht kann ich mich revanchieren, indem ich die Anbindung an den Objektinspektor hier veröffentliche, wenn ich das geschafft habe.

Der Rtti Inspektor von TMS Software erfordert genauso Einarbeitung, wie der von Kasparsoft, den ich schon habe.

Außerdem will ich ja, wenn ich schon fertigen Quelltext angeboten kriege, diesen nicht nur fix und fertig benutzen, sondern schon auch verstehen. Hatte zunächst nur in den Quelltext geguckt.

Erst danach habe ich das Demo gestartet und die XML Datei erzeugen lassen. In dieser ist genau die Information enthalten, die ich brauche. Nur will ich halt gerne verstehen, wie das der XML Serialisierer macht, sonst hab ich bloß fertigen Quelltext übernommen und nix dazu gelernt. Da gab es, glaub ich, erst vor kurzem eine recht unschöne Diskussion über "Codeschmarotzer". Letzteres hab ich nicht vor. Ich werde deshalb den Quelltext des Serialisierers jetzt studieren.
:gruebel:
Die Jedis wollen genau so erst mal verstanden sein. Nee, alles nacheinander. Jetzt ist erst mal der Serialisierer dran. Ich kann unmöglich alles auf einmal machen. :coder:

delphifan2004 17. Mär 2009 14:12

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Hallo,

Wenn ich das hier so lese, hab auch Formdesigner Projekte gefunden, da frag ich mich doch, wa sist daran so interessant. Ist es der Spieltrieb, so einen Designer mal nachzubauen oder steckt mehr dahinter. Hier in diesem Thread scheint es um den Objektinspektor zu gehen.

Für Linux gibt es Lazarus und den Qt-Desingner. Ob MseIde da mithält, kann ich nicht beurteilen.
Auf der Windows Seite haben wir Visual Basic Delphi und C++Builder.

Trotzdem gibt es kommerzielle Komponenten, die einen Nachbau des Designers ermöglichen und die Jedi Gruppe hat auch nicht gerade wenig Zeit darauf verwendet, Designerkomopnenten bereit zu stellen.

Mich beschäftigt die Frage nach dem Warum? Ist es Spieltrieb oder steckt mehr dahinter. Ich kann mir nicht vorstellen, das es auch mit den Designerkomponenten alles andere als einfach ist, erfahrenen Firmen wie Microsoft oder CodeGear Konkurrenz zu machen.

Vielleicht kann mir ja mal jemand posten, worin der höhere Sinn und Zweck solcher Designernachbauten besteht. Ein Spleen von paar Freaks kann das nicht sein, dann würde sich das kommerziell nicht lohnen.

_frank_ 17. Mär 2009 14:58

Re: RTTI - Typinformation kommt nicht am Ziel an
 
einerseits ist es reizvoll sich mit der (delphi-) internen Struktur auseinanderzusetzen,
weiterhin ist das ein Projekt, was nicht schon 1000 mal programmiert wurde :),
und letztendlich hab ich versucht mit dem DFM-Editor ein Programm zu schreiben, wo man (später auch scriptgesteuert) Delphi-Form-Dateien zu allen Delphi-Versionen und Lazarus untereinander kompatibel zu machen.

soviel zu meinen Ambitionen für den DFM-Editor

Gruß Frank

I.A 17. Mär 2009 16:14

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Hallo!

Hab zunächst die Helperklasse gefunden:

TSerializeToXMLHelper = class helper for TObject

Daher also die Vererbung des Serialisierers an alle Nachfolgeklassen. Interessantes Konzept.

Wo gibt es dazu verständliche Literatur?

Leider sind mir die Jedi Komponenten noch ne Nummer zu groß. Kann ja sein, das die Zuweisung der Klasse an den Inspektor mit:

Delphi-Quellcode:
begin
  inspectorMain.InspectObject := form1;
end;
kinderleicht geht. Nur habe ich damit den Quelltext dieses Objektinspektors immer noch nicht verstanden. Da ich aber einen anderen habe, den ich genauso erst mal verstehen will, wird das mit Jedi jetzt zu viel. Erst mal den Einen verstehen. :gruebel:

Ich fürchte aber, das der Xml Serialisierer nicht das leistet, was ich will, nämlich die Typinformation der Klasse. Das Demo des Serialisierers zeigt, wie eine Klasse nachdem sie in einer Xml Datei gespeichert wurde, wieder geladen werden kann, wobei die Eigenschaftswerte übernommen werden. So kann ich die Größe des Formulars ändern oder seine Position. In die Xml Datei gespeichert, kann ich mein Formular fortan an der neuen Position in neuer Größe anzeigen lassen. Das hilft mir bei zukünftigen Projekten.

Damit habe ich aber noch immer keine Typinformation, um die Eigenschaften einer beliebigen KOmpo anzeigen zu können. Objektinspektor hab ich. Was ich brauche, ist die Typinformation der Klasse, die in diesem Objektinspektor angezeigt werden soll.

Daher auch die Eröffnung des Threads, weil der im ersten Beitrag stehende Quelltext die gewünschte Typinformation nicht liefert. Aber wo ist mein Fehler im obigen Quelltext.

Es ist gut gemeint, :thumb: wenn ihr mir weitere Quelltexte schickt. Aber ich möchte eigentlich erst mal verstehen, warum mein Quelltext zum Sammeln von Typeinfo nicht funzt? :wall:


@Delphifan2004: Meine Motivation ist ähnlich der von @_frank_.

sirius 17. Mär 2009 16:20

Re: RTTI - Typinformation kommt nicht am Ziel an
 
[delphi]
AClassAnchor := AClass; //AClass wurde an anderer Stelle instnatiiert
if Assigned(FClassAnchor) then
[/quote]
Was sinds für drei Variablen, wo kommen die her?

stoxx 17. Mär 2009 16:52

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Zitat:

Mich beschäftigt die Frage nach dem Warum? Ist es Spieltrieb oder steckt mehr dahinter.
Wir benutzen das für Parametereinstellungen .. einfach eine Klasse gebastelt, alle Properties published .. und schon kann man alle Parameter konfigurieren ... einstellen und verändern .. sogar treeviewfähig ...

mit xml kann man sie auch gleich noch abspeichern ... neuer Quelltext ist nicht nötig, es reicht, wenn man eine gemeinsame Basisklasse hat und diese abspeichert ..

Beliebig erweiterbar, man muss sich um nix mehr kümmern, sehr einfach.
Könnte man auch nehmen um die normalen Programmoptionen zu verändern, einzustellen .. usw.


Zitat:

Was ich brauche, ist die Typinformation der Klasse
ähm, bescheidene Frage, was ist eine Typinformation einer Klasse? :shock:


edit: oder meinst Du da? steht doch schon da: "tkClass" eben :-)

..

_frank_ 17. Mär 2009 17:16

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Zitat:

Zitat von I.A
Damit habe ich aber noch immer keine Typinformation, um die Eigenschaften einer beliebigen KOmpo anzeigen zu können. Objektinspektor hab ich. Was ich brauche, ist die Typinformation der Klasse, die in diesem Objektinspektor angezeigt werden soll.

hast du dir mal die rttifunctions vom DFMEditor angeschaut? dort ist doch soweit alles drin und nicht zuviel (816 Zeilen). versteh nicht so ganz was du machen willst...im Fall von tkClass musst du deine laderoutine (also wo du den typ [tk*] unterscheidest) einfach rekursiv aufrufen. schau dir mal GetComponentProps in besagter Unit an...

ansonsten würde ich deinen Code auch testen, hab nur den ValueListEditor nicht (D3).
dfmeditor ist mit D3 geschrieben und mein OI baut auf o.g. Funktion auf.

HTH Frank

I.A 18. Mär 2009 12:31

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Zitat:

Zitat von sirius
Delphi-Quellcode:
AClassAnchor := AClass; //AClass wurde an anderer Stelle instnatiiert
if Assigned(FClassAnchor) then
Was sinds für drei Variablen, wo kommen die her?

AClass wird über eine Prozedur, später Methode einer Klasse an AClassAnchor übergeben.
AClass ist diejenige Klasse, deren Eigenschaften+Ereignisse der Objektinspektor später
anzeigen soll. Der User _frank_ hat mir mit dem Quelltext von TSizeControl einen Formdesigner
gegeben. Der enthält die anzuzeigenden Komponenten, von denen die selektierte an AClass übergeben wird.

Zitat:

Zitat von stoxx
Wir benutzen das für Parametereinstellungen .. einfach eine Klasse gebastelt, alle Properties published .. und schon kann man alle Parameter konfigurieren ... einstellen und verändern .. sogar treeviewfähig ...

mit xml kann man sie auch gleich noch abspeichern ... neuer Quelltext ist nicht nötig, es reicht, wenn man eine gemeinsame Basisklasse hat und diese abspeichert ..

Beliebig erweiterbar, man muss sich um nix mehr kümmern, sehr einfach.
Könnte man auch nehmen um die normalen Programmoptionen zu verändern, einzustellen .. usw.

Interessante Anregung. So könnte man seine Anwendung auch in vieler Hinsicht zur Laufzeit im Aussehen verändern. Oder bei einer unsichtbaren Klsse deren Verhalten in der Anwendung beeinflussen. So weit hab ich noch gar nicht gedacht. Schön, wieder was dazu gelernt.

Zitat:

ähm, bescheidene Frage, was ist eine Typinformation einer Klasse? Shocked
Typinformation der Klasse ist die Information über deren Methoden, Eigenschaften (Name,Typ,Wert) und Ereignissen. Erst damit können diese Klassen im Objektinspektor der Delphi IDE bearbeitet werden. Erst so ist der Designer überhaupt möglich.


Zitat:

Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
Der Spruch gefällt mir.


Zitat:

Zitat von _frank_

Zitat:

Zitat von I.A
Damit habe ich aber noch immer keine Typinformation, um die Eigenschaften einer beliebigen KOmpo anzeigen zu können. Objektinspektor hab ich. Was ich brauche, ist die Typinformation der Klasse, die in diesem Objektinspektor angezeigt werden soll.

hast du dir mal die rttifunctions vom DFMEditor angeschaut? dort ist doch soweit alles drin und nicht zuviel (816 Zeilen). versteh nicht so ganz was du machen willst...im Fall von tkClass musst du deine laderoutine (also wo du den typ [tk*] unterscheidest) einfach rekursiv aufrufen. schau dir mal GetComponentProps in besagter Unit an...

Ja, habe ich, aber noch nicht verstanden, wie ich damit die Typinfo kriege die ich haben will.
Ich brauche sowas hier:

Delphi-Quellcode:

type
  TPropertyList = TPropertyListType;

var
  MeineKomponente: TWinControl; oder Komponententyp der akt. Kompo. (TMemo, TEdit...)
   
procedure GetProperties(VonMeinerKomponente: TWincontrol; out Eigenschaftenliste: TPropertyList);

Die Rttifunctions setzen die Kenntnis von Eigenschaftnamen voraus. Bei f GetSubInstance() muss ich den Namen der Subinstnz kennen. Bei f FindTypeInfo() brauche ich den Typnamen, bei getSubClass muss ich ebenso den Namen der Eigenschaft der SubClass kennen.

Und eben diese Informationen will ich mit meiner Codeversion erst gewinnen.
Der TPropertyListtype sollte enthalten:

-Name der Eigenschaft
-Typ der Eigenschaft (sowohl Typname als auch TypeKind)
-Link zum Eigenschaftseditor

Der Objektinspektor von Kasparsoft kann verschiedene EditControls enthalten, die sich analog zum Delphi Objektinspektor verhalten. Es gibt Comboboxen, Ellipsenschaltflächen, einfache Editfelder das Pluszeichen links, das bei Anklicken weitere Reihen mit Eigenschaften anzeigt.

Aber ich brauche dazu die Eigenschaften meiner Klasse, die in diesem Objektinsprktor angezeigt werden sollen.

Zitat:

Zitat von _frank_
ansonsten würde ich deinen Code auch testen, hab nur den ValueListEditor nicht (D3).
dfmeditor ist mit D3 geschrieben und mein OI baut auf o.g. Funktion auf.

Ja, ich habe mir die RTTI Funktionen vom DFMEditor angeschaut. Ich habe aber auch mit Studium von dfmedit noch nicht rausgekriegt, wie ich die Information zu den Eigenschaften und Ereignissen einer Komponente so bekomme, das sie im Objektinspektor angezeigt und bearbeitet werden können.

Um meinen Code zu testen, brauchst Du den ValueListeditor nicht. Ein Stringgrid tut es auch. Nur habe ich Delphi
7 halt und da gibt es den ValueListeditor. Die Delphi Hilfe gab mir bei Methoden des ValueListeditors
die Anregung, die Methode InsertRow zu verwenden. Ein TMemo reicht genau so.

Delphi-Quellcode:
DebugInsp.InsertRow(  //Debugisp ist ein ValueListEditor
               ATypeInfo.PropertyName[Index],
               ATypeInfo.PropertyType[Index].Name,
               true
            );
Hier ist meine InsertRow() Methode noch mal. In eine Memo könnte man zum Test folgendes einfügen:

Memo1.Lines.Add(ATypeInfo.PropertyName[Index] + ': ' + ATypeInfo.PropertyType[Index].Name);

Und jhier noch ein Vorschlag für das TStringGrid.

Delphi-Quellcode:
var
  ARowCount: Integer = 1;

procedure InsertRowInto(AClass: TWinControl; AProperty, AType: String);
//Der Boolean-Parameter wird hier nicht benötigt, ich will ja nur die
//Klasseneigenschaften angezeigt haben, um zu sehen, ob die Typinformation
//wunschgemäß ankommt.
begin
  Inc(ARowCount);
  if Assigned(AClass) then
  begin
    TStringGrid(AClass).FixedCols := 0;
    TStringGrid(AClass).FixedRows := 1;
    TStringGrid(AClass).Cells[0,0]:= 'Eigenschaft';
    TStringGrid(AClass).Cells[1,0]:= 'Typ';
    if TStringGrid(AClass).RowCount > ARowCount then TStringGrid(AClass).RowCount := ARowCount;
    TStringGrid(AClass).Cells[0, ARowCount] := AProperty;
    TStringGrid(AClass).Cells[1, ARowCount] := AType;
  end;
end;
Sowas hier will ich wegen der Typinfo am Ende haben, um dann für jede beliebige Anwendung
die Typinformation zu kriegen, wenn ich sie denn brauche.

Darf ich Dir meinen Code mal zum Testen schicken?



Weil das Gewinnen der Typinformation so schwierig ist, wäre eine Klasse der folgenden Art ideal, um die Probleme der Gewinnung geeigneter Typinfprmation der Vergangenheit angehören zu lassen:

Delphi-Quellcode:
unit TypeInfoClasses;

interface

uses
  Classes, Sysutils, TypInfo;

type
  //Stringtyp entweder hier konkret anpassen oder bedingt compilieren,
  //um bedarfsgerechten Stringtyp zu erhalten
  TStringType = String;
  TClassTypeInfo = class(TPersistent)
  private

  public
    property MethodKind: TTypeKind;
    property MethodName: TStringType;
    ......                              //weitere Eigenschaften zur Methodeninfo oder
    ......                              //sonstigen Infos (PropValue..) die wichtig sein
    ......                              //könnten.

    property PropertyTypeName[Index: Integer]: TStringType;
    property PropertyTypeKind[Index: Integer]: TTypeKind;
    property PropertyBy[Index: Integer]: TStringType;
    property PropertyBy[Name: TStringType]: TStringType;
  end;

implementation

end.
Die Idee für so eine Klasse entspringt dem Wunsch, unkompliziert Typinformation passend für meine Anwendung zu erhalten, konkret jetzt Formdesigner mit Objektinspektor, später, wer weiß. Der User stoxx hat ja eine interessante Anregung gegeben. Dazu wäre diese Typifoklasse bestens zu gebrauchen.

_frank_ 18. Mär 2009 15:45

Re: RTTI - Typinformation kommt nicht am Ziel an
 
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

I.A 19. Mär 2009 19:04

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Hallo _frank_!

Hab grad die Prozedur GetCompnentProps() im Testlauf. So klappt das wunderbar.

Hier ist mein Quelltext:

Delphi-Quellcode:
  GetComponentProps(TComponent(AClass).ClassName, FDebugProps, True);
  for Index := 0 to FDebugProps.Count - 1 do
           DebugInsp.InsertRow(FDebugProps[Index],' ',true);
Danke wie verrückt für alle Hilfe. :hello:

I.A 20. Mär 2009 23:58

Re: RTTI - Typinformation kommt nicht am Ziel an
 
Hallo,

leider muss ich Euch noch mal nerven. :wall:

Wenn ich die Eigenschaft

ActiveControl von Form1

des Formdesigners aus dem DemoSizeCtrl Projekt vom User _frank_ im Objektinspektor einstelle, klappt alles wie gewünscht.

Aber wenn ich ActiveControl durch Klicken in die Komponente finden will, klappt es nicht mehr.

Nach meinem Verständnis musste es so aussehen:
Delphi-Quellcode:
procedure TForm1.SizeCtrlMouseDown(Sender: TObject;
  Target: TControl; TargetPt: TPoint; var handled: boolean);
var
  i: integer;
begin
  //When clicking the PageControl, it's kind of nice to be able to change pages.
  //So, let's see if a new page needs to be displayed ...

  //#####  Diese Zeile habe ich eigefügt #####
  ActiveControl := TWinControl( SizeCtrl.TargetCtrlFromPt(TargetPt) );

  if (Target is TPageControl) then
    with TPageControl(Target) do
    begin

      //We need the PageIndex of the tab being clicked. The following line
      //is fine in Delphi 7 but isn't available with older compilers ...
      //    with TargetPt do i := PageControl1.IndexOfTabAt(X, Y);
      //Therefore, this is my workaround which works back to Delphi 3 ...
      with TargetPt do i := My_IndexOfTabAt(TPageControl(Target), X, Y);

      if (i >= 0) and ( ActivePage.PageIndex <> i) then
      begin
        //since further mouse handling stuff is not required ...
        handled := true;
        //Unregister from SizeCtrl all controls on the current page ...
        UnregComponents(PageControl1, SizeCtrl);
        //select the new page ...
        ActivePage := Pages[i];
        //finally, register controls on the new page...
        RegComponents(PageControl1, SizeCtrl);
      end;
    end;
end;
Habe soeben in TSizeCtrl.DoWindowProc folgendes gefunden. Werde als nächstes hier erweitern: :coder2:

Delphi-Quellcode:
case Msg.Msg of
          WM_LBUTTONDOWN: PostMouseDownMessage(true, ssShift in ShiftState);

//ich werde das hier versuchen:
case Msg.Msg of
          WM_LBUTTONDOWN:
              begin  
                CurrentControl := regCtrl; //was ich im OI sehen will
                PostMouseDownMessage(true, ssShift in ShiftState);
              end;
Fall das nicht klappt, frag ich mal, an welcher Stelle im Message Record vom Typ TMessage das gesuchte Control zu finden ist?

Das Musste ich ja denn anstelle von regCtrl zuweisen können.
:gruebel:

_frank_ 21. Mär 2009 07:57

Re: RTTI - Typinformation kommt nicht am Ziel an
 
falsch...
dur darfst nicht mit activeControl arbeiten, activecontrol ist immer das TSizeCtrl (wenn aktiv). aber das TSizeControl hat eine eigenschaft, um die markierte(n) Komponente(n) zu ermitteln:

Delphi-Quellcode:
TsizeCtrl.targets[index]
diese übermittelst du deinem OI, kannst auch mal im DFMEdit-Source schauen...die ganze ansteuerung der SizeCtrl-Komponente ist in der preview_u.pas :) am wichtigsten sollte die Methode SizeControl1TargetChange sein.

HTH Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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