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? |
Re: RTTI - Typinformation kommt nicht am Ziel an
Zitat:
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:
edit: oder meinst Du da? steht doch schon da: "tkClass" eben :-) .. |
Re: RTTI - Typinformation kommt nicht am Ziel an
Zitat:
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 |
Re: RTTI - Typinformation kommt nicht am Ziel an
Zitat:
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:
Zitat:
Zitat:
Ich brauche sowas hier:
Delphi-Quellcode:
Der TPropertyListtype sollte enthalten: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. -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:
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:
Hier ist meine InsertRow() Methode noch mal. In eine Memo könnte man zum Test folgendes einfügen:
DebugInsp.InsertRow( //Debugisp ist ein ValueListEditor
ATypeInfo.PropertyName[Index], ATypeInfo.PropertyType[Index].Name, true ); Memo1.Lines.Add(ATypeInfo.PropertyName[Index] + ': ' + ATypeInfo.PropertyType[Index].Name); Und jhier noch ein Vorschlag für das TStringGrid.
Delphi-Quellcode:
Sowas hier will ich wegen der Typinfo am Ende haben, um dann für jede beliebige Anwendung
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; 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:
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.
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. |
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:
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).
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; 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:
du brauchst private variablen, um properties speichern zu können...hat aber nix mit rtti zu tun, sondern mit normalem Klassendesign.
property MethodKind: TTypeKind;
property MethodName: TStringType; so sollte das aussehen...(kannst statt string auch deine eigene Definition nehmen (TStringType)):
Delphi-Quellcode:
HTH Frank
type
cls=class(basisclass) FKind:TTypeKind; FName:string; published property MethodKind: TTypeKind read fKind write fKind; property MethodName: string read fName write fName; |
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:
Danke wie verrückt für alle Hilfe. :hello:
GetComponentProps(TComponent(AClass).ClassName, FDebugProps, True);
for Index := 0 to FDebugProps.Count - 1 do DebugInsp.InsertRow(FDebugProps[Index],' ',true); |
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:
Habe soeben in TSizeCtrl.DoWindowProc folgendes gefunden. Werde als nächstes hier erweitern: :coder2:
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;
Delphi-Quellcode:
Fall das nicht klappt, frag ich mal, an welcher Stelle im Message Record vom Typ TMessage das gesuchte Control zu finden ist?
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; Das Musste ich ja denn anstelle von regCtrl zuweisen können. :gruebel: |
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:
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.
TsizeCtrl.targets[index]
HTH Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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