Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Suche Inspektor-Komponente


jakobwenzel - Mo 20.04.09 18:24
Titel: Suche Inspektor-Komponente
Hallo zusammen!

Ich bin auf der Suche nach einer Komponente die den Delphi-Objektinspektor zur Laufzeit funktionsfähig nachbildet.
Klar würde man sagen: guck doch bei den Jedis - doch so weit ich sehe kann der JvInspector immer nur ein Objekt gleichzeitig inspecten (oder man hat die Einträge doppelt, einmal für jedes Objekt - ganz große Klasse), ich bräuchte aber eine Liste von Objekten und der stellt mir dann nur die Eigenschaften dar, die all diese Komponenten gemeinsam haben.
Meine Objekte stammen dabei nicht von TControl oder sowas ab, haben aber eine gemeinsame Basisklasse.

Kennt da jemand eine gute Komponente?

mfg
Jakob


Jakob_Ullmann - Mo 20.04.09 18:37

Deine Frage hört sich so an, alsob du deine anwendungseigenen Delphi-Objekte 'inspecten' willst, ist das richtig?


jakobwenzel - Mo 20.04.09 18:56

Exakt das, das hab ich vielleicht im 1. Post nich genau genug geschrieben.


BenBE - Di 21.04.09 12:20

Bei dem JvInspector gibt es auch so eine Art "Custom"-Modus, bei dem man eigene Einträge darstellen kann. Die Properties von den Objekten auszuwerten ist über die RTTI relativ einfach.


jakobwenzel - Di 21.04.09 17:15

Grade das hatte ich eigentlich nicht vor... :roll:
Ich mach bei dem Programm schon alles mögliche selber, wos Alternativen gäbe aber wenn man sich dann mal Arbeit abnehmen lassen will -.-
Aber ich schaus mir mal an :)


BenBE - Di 21.04.09 18:52

Du kannst Dir die Arbeit dafür ja entsprechend in einer Ableitung der Komponente kapseln, dann zentralisiert sich genau die Arbeit ...


jakobwenzel - Di 21.04.09 19:20

Es war ja sogar noch einfacher als ich dachte, vor allem war es weniger Schreibarbeit als erwartet :D
Fertig und funktioniert perfekt

Danke für den Hinweis dass es doch so einfach ist :lol:


BenBE - Di 21.04.09 19:40

Kannst deine Lösung mal kurz skizzieren?


jakobwenzel - Di 21.04.09 19:51

Also, ich hab mir den Code von TJvInspectorPropData kopiert, mir nen neuen Namen ausgedacht und letztendlich alle Instance:TObject-Sachen durch Instances:TObjectList ersetzt. Beim Zusammensuchen der Properties muss man natürlich erstmal eine gemeinsame Elternklasse finden, für die man sich dann die PropInfos holt.
Beim auslesen (GetAsXYZ) guck ich ob auch in allen Objekten das selbe steht und geb sonst 0 / nen Leerstring zurück. Was noch fehlt is ne optische Markierung von den Leerwerten, da hab ich noch nix außer so nem Ereignis in der Painter-Komponente gefunden (gut, ich hab auch noch nicht wirklich gesucht). Beim speichern (SetAsXYZ) wird natürlich in allen Objekten gespeichert.
Füllen des Inspektors geht dann so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  list:=TObjectList.Create;
  list.add(edit1);
  list.add(button1);
  TJvInspectormultiPropData.New(jvinspector1.Root, list);
  list.OwnsObjects:=false;
  list.free;

Was man dann noch machen kann ist vom Inspektor ne neue Klasse ableiten, die ne ObjectList als property hat und im OnChange von der Liste das ding neu füllt.


BenBE - Di 21.04.09 19:55

In Delphi der Inspektor bietet IIRC auch von unterschiedlichen Komponenten gleichnamige Properties an, die in der Elternklasse nicht existierten ... vorausgesetzt, gleicher Datentyp ... Bin mir da aber nicht sicher ...


jakobwenzel - Di 21.04.09 20:01

Jup, tut er, aber da ich den zusätzlichen Aufwand für meinen Anwendungszweck eh nicht brauch hab ichs gelassen :mrgreen:
Man siehts auch schon bei meinem Beispiel: Font wird nicht angezeigt, aber im Delphi-Inspektor schon.


aLeXanDer.. - Mo 18.06.12 10:23

Wäre an einer detailierteren Lösung interessiert bzw. der Klasse JvInspectorMultiPropData.


jaenicke - Mo 18.06.12 11:16

Ich habe es dann doch selbst gemacht, weil der JvInspector quälend langsam war und die Properties sich bei mir beim Ziehen einer Komponente oft aktualisieren. Da hat es dann nur noch gehakt.

Ein Beispiel für das Auflisten von RTTI-Daten findest du bei den Delphi Samples, bei Delphi XE z.B. hier:

Quelltext
1:
Desktop\Bibliotheken\Dokumente\RAD Studio\8.0\Samples\Delphi\RTL\AttributesAndRTTI\rtti_browser                    
Im Grunde nimmst du einen TRttiContext, holst dir damit mit GetType die Typinformationen und dann davon mit GetProperties die Eigenschaften der Klasse. Bei jeder einzelnen TRttiProperty wiederum kannst du mit GetValue den Wert dieser Property bei einem konkreten Objekt abfragen.


aLeXanDer.. - Mo 18.06.12 15:40

Hast du dann ein eigenes Objekt erstellt das dir aus einer ObjektListe nur die gemeinsamen Properties anzeigt und bei veränderung entsprechende Objekte updatet ?

Ist das RTTI in Delphi/C++ 2009 bereits implementierT?


jaenicke - Mo 18.06.12 16:20

Ja, genau, ich habe natürlich die Virtual TreeView benutzt und jeder Knoten ist ein eigenes Objekt. Die Zusammenfassung unterschiedlicher Werte bei mehreren markierten Objekten wird wiederum durch eine Zwischenschicht erledigt.

Ja, die RTTI gibt es auch da schon, aber ob das da genauso funktioniert kann ich dir leider nicht sagen.