Objektinspektor zur Laufzeit



  • Das sieht sehr vielversprechend aus.
    Hast du schon damit gearbeitet ?

    Wo muss ich das in meinem Fall implementieren ? jeweils in mein Objekt oder in das Programm das mit den Objekten arbeitet ?
    Hast du ein Beispiel ?



  • aLeXanDer.. schrieb:

    Hast du schon damit gearbeitet ?

    Ja, daher die Empfehlung. Ist allerdings schon um die vier Jahre her.

    aLeXanDer.. schrieb:

    Wo muss ich das in meinem Fall implementieren ? jeweils in mein Objekt oder in das Programm das mit den Objekten arbeitet ?

    Du mußt gar nichts implementieren. Wenn deine Klasse Eigenschaften hat, die __published sind und du an den JvInspector eine Instanz deiner Klasse übergibst, dann bekommt der Benutzer diese Eigenschaften zur Bearbeitung angeboten. So hab ich's in Erinnerung.

    aLeXanDer.. schrieb:

    Hast du ein Beispiel ?

    In der JVCL-Distribution sind welche enthalten.



  • Next-Inspector wäre auch ein Blick wert, das ist auf jedenfall einfacher zu verwenden als der JvInspector von JVCL

    http://www.bergsoft.net/component/next-inspector/overview.htm



  • Ja, der Next Inspector ist auch gut, schickeres Design, und deutlich einfacher zu benutzen, wenn man irgendwelche Eigenschaften in der UI eines Objektinspektors zugänglich machen will. Aber für den Reflection-basierten Einsatz (d.h. für __published-Properties) fand ich den JvInspector besser. Ich müßte allerdings nachschauen, was die Gründe im Einzelnen waren.



  • JvInspector is genau das was ich an sich gesucht habe.
    Momentan häng ich aber daran das der Benutzer bei Properties die "TColor" sind eine Auswahl an Farben angezeigt bekommt. Bis jetzt muss er sie Namentlich genau eintippen.

    Jemand der schon erfahrung damit hat nen Tipp wie ich das lösen kann?



  • aLeXanDer.. schrieb:

    JvInspector is genau das was ich an sich gesucht habe.
    Momentan häng ich aber daran das der Benutzer bei Properties die "TColor" sind eine Auswahl an Farben angezeigt bekommt. Bis jetzt muss er sie Namentlich genau eintippen.

    Kommt drauf an.

    Mal so allgemein gesagt, zu JvInspector gibt es Dokumentation:
    http://wiki.delphi-jedi.org/wiki/JVCL_Help:TJvInspector
    Am meisten lernst du aber - wie immer -, wenn du den Quelltext liest.

    Wenn es nur um die Color-Eigenschaft geht, die viele VCL-Steuerelemente haben, sollte das möglich sein. Du müßtest dann eine Klasse von TJvCustomInspectorItem ableiten, die die Methoden GetDisplayValue(), GetValueList(), SetDisplayValue() und SetFlags() überschreibt und darin die gewünschten Strings für die Farben zweckgemäß verarbeitet (ist eigentlich klar, wenn man die Methodendeklarationen liest). Die Klasse mußt du dann registrieren:

    TJvCustomInspectorData::ItemRegister ()->Add (new TJvInspectorTypeInfoRegItem (
      __classid (Tmy), TypeInfo_TColor ()));
    

    TypeInfo_TColor() mußt du vorher in einem Delphi-Unit definieren, das du in dein Projekt einbindest:

    unit TypeInfoHelpers;
    
    interface
    
    uses
      TypInfo;
    
    function TypeInfo_TColor: TTypeInfo;
    
    implementation
    
    uses
      Graphics; // da sollte TColor drin sein
    
    function TypeInfo_TColor: TTypeInfo;
    begin
      Result := TypeInfo (TColor);
    end;
    

    Der Compiler generiert dann automatisch einen Header (TypeInfoHelpers.hpp), den bindest du einfach mit #include ein.

    Ich hab's allerdings nicht getestet, also keine Gewähr.

    Wenn es allerdings um TColor-Eigenschaften geht, die in C++-Code definiert werden, wird's problematisch, weil C++ keine "strong typedefs" kennt. In Delphi ist TColor nur ein Typedef für Integer, allerdings mit eigener Typinformation. Sowas geht in C++ nicht, deshalb würde es in diesem Fall etwas komplizierter.



  • Es geht sogar noch viel einfacher. Gerade fiel mir auf, daß es ja noch das Unit JvInspExtraEditors.pas gibt; darin sind die Klassen TJvInspectorAlignItem, TJvInspectorAnchorsItem, TJvInspectorColorItem und TJvInspectorTImageIndexItem enthalten. Die Klassen haben alle eine statische Methode RegisterAsDefaultItem(), mit der du sie als Default-Handler für die jeweiligen Typen registrieren kannst:

    TJvInspectorColorItem::RegisterAsDefaultItem ();
    

    Das sollte dir die ganze Arbeit abnehmen.



  • Danke audacia, das war genau das was ich gesucht hatte!
    Perfekt! Danke 👍



  • Mal noch eine ergänzende Frage zu dem ganzen.
    Hab leider noch nichts dazu gefunden. und Zwar, ob es die Möglichkeit gibt wie in der IDE meherere Objekte (gleicher Klasse oder Unteschiedlicher Klasse) zu übergeben und das dort dann die gemeinsamen Properties angezeigt werden, wie Left, Top ect.
    und wenn ich dann eines dieser Props ändere, das sich das auf alle ausgewählten auswirkt.

    Habe bis jetzt nur "InspectObject" gefunden, hier kann nur ein 1 Objekt angegeben werden.
    Und "AddComponent" hier kann ich in einem Inspector mehrere Objekte hinzufügen, diese werden aber als eigene Gruppen angezeigt.

    Vielleicht jemand ne Idee ? nen Tipp ?

    Danke



  • Ich vermute nicht - das mußt du selbst implementieren.


Anmelden zum Antworten