Komponentenentwicklung - geschachtelte Eigenschaften
-
Ich bin's mal wieder!

Es interessiert mir brennend, wie man Eigenschaften in eine eigene Komponente einbindet, die sich später im Objektinspektor aufklappen lassen?
( z.B.: Anchors, BorderIcons, Font, ... )Ich würde nämlich gerne auf eine Eigenschaft 'Kreis' haben, mit den Unterpunkten:
- X
- Y
- Height
- WidthDamit soll dann immer ein Kreis auf der Komponente gezeichnet werden.
Wenn ich tippen sollte, würde ich sagen, es funktioniert irgendwie mit einer Klasse, mit Struct, oder Type ?
?Freue mich auf eure Antworten!
Nebenbei: Weis jmd, wie ich anstatt 'ClassExplorer' immer 'Klassenhierachie' neben meinen Quellcode anzeigen lassen kann?
Liebe Grüsse ...
-
http://bcb-tutorial.c-plusplus.net/inhalt.html
schau mal unter "komponentenentwicklung" rein
-
Klasse Seite,
werde ich bestimmt nochmal reinschauen
Allerdings habe ich für mein Problem meine Lösung gedunden.

Dort ist nur beschrieben, wie man bei Eigenschaften nicht direkt auf Variablen, sondern über Methoden auf den entsprechenden Wert zugreift.
Das wollte ich zwar sowieso machen, aber mit meinen "Aufklapp"-Eigenschaften hat dass erstmal noch nichts zu tun.
Oder übersehe ich jetzt etwas?
?Liebe Grüsse ...
-
Hallo
das Stichwort heißt __published:
Das wird auf der genannten Seite z.B. im zweiten Kapitel von Komponenten entwickeln erklärt.bis bald
akari
-
Es interessiert mir brennend, wie man Eigenschaften in eine eigene Komponente einbindet, die sich später im Objektinspektor aufklappen lassen?
( z.B.: Anchors, BorderIcons, Font, ... )zB Font ist auch nur eine Klasse.(siehe bcb-hilfe TFont)
da die klasse ihre eigenen eigenschaften hat, glieder der bcb das so, dass man über Font zB auf size zugreiffen kannKomponente->Font->Size
-
Super! Das wollte ich wissen!

Also musste ich etwas in der Art schreiben, oder?
class Kreis { private: int ix; int iy; int ih; int iw; __published: __property X = {read=ix,write=ix}; // oder halt ne Methode zum schreiben __property Y = {read=ix,write=ix}; __property H = {read=ix,write=ix}; __property W = {read=ix,write=ix}; }; //====================================== class MeineKomponente : public TComponent { private: Kreis MKreis __published: __property MKreis; };
-
nicht ganz, da fehlt noch was [Edit:] selbst das dürfte noch zu wenig sein...
class MeineKomponente : public TComponent { private: Kreis *FMKreis; __published: __property Kreis *MKreis = (read=FMKreis, write=FMKreis); };und im Konstruktor von MeineKomponente muß FMKreis mit new erzeugt und im Destruktor mit delete gelöscht werden
und falls du Defaultwerte haben willst, sollte ein Kunstruktor in der class Kreis definiert werden
[Edit2] bei den Properties in class Kreis fehlen die Rückgabetypen
-
Hallo
und den Pointer auf FMkreis must du machen, weil du Kreis von TObject ableiten must, um mit __published zu arbeiten. Außerdem must du bei __property moch den Typ angeben.
bis bald
akari
-
Dankeschön!!!
Werde das gleich mal ausprobieren!

Liebe Grüsse ...
-
schau dir auch das Kapitel "Die Zugriffseigenschaften deklarieren" in der BCB-Hilfe zur Komponentenentwicklung an
-
Supi

Das funktioniert!!!!!!!Aber warum schreibt der Objektinspektor jetzt "(Kreis)" als Wert von "Kreis",
und nicht "[wert, wert]" wie bei z.B. Anchors?Bei "Font" schreibt er zwar auch "(Font)",
aber da gibt es auch den Button mit den 3 Punkten [...]
zum aufrufen eines neuen Fensters!Wie kann ich denn das eine, wie das andere realisieren?

-
weil TAnchors eine enum-Variable ist und parameter gesetzt werden
und bei TFont einen Editor definiert ist (wie auch bei TPicture etc..)
ich glaube letztens war ein thread darüber offen, wie man solche editore definieren kann
-
über die (...) öffnet man die Editoren, wie bei Font
das geht dann ungefähr so:namespace MeineKomponente { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(MeineKomponente)}; RegisterComponents("Beispiele", classes, 0); RegisterPropertyEditor(__typeinfo(Kreis),__classid(MeineKomponente), "Kreis",__classid(KreisProperty)); // -> Variante 1 RegisterPropertyEditor(__typeinfo(Kreis),NULL,"", __classid(KreisProperty)); // -> Variante 2 }auch in der BCB-Hilfe zur Komponentenentwicklung gibts einige Themen dazu
[Edit] den ensprechenden Editor (KreisProperty) mußt du dir dafür natürlich auch noch schreiben
das bei Anchors geht glaub ich nur bei Werten von Typ bool, wie auch bei Style
ansonsten wird halt nur der Klassenname angezeigt
-
BigNeal schrieb:
weil TAnchors eine enum-Variable ist
TAnchors ist ein Set, das Einträge vom (enum-)Typ TAnchorKind aufnehmen kann.
Linnea schrieb:
das bei Anchors geht glaub ich nur bei Werten von Typ bool, wie auch bei Style
Welches Style meinst Du? Die gebräuchlichen (z.B. TFont::Style, TBrush::Style) sind ebenfalls vom Typ Set.
Gruß,
Alexander
-
Mein Gott, das wird richtig geil!!!
Ich beiß mich dann mal durch!
Schönen Dank an euch alle!

War bestimmt nicht meine letzte Frage...

-
insaint schrieb:
Nebenbei: Weis jmd, wie ich anstatt 'ClassExplorer' immer 'Klassenhierachie' neben meinen Quellcode anzeigen lassen kann?
Klassenhierarchie? Meinst du die Objekt-Hierarchie? Wenn ja:
- Rechtsklick in der Objekt-Hierarchie; wenn nicht schon markiert, "Andockbar" markieren
- wenn du Class-Explorer nicht mehr dort haben willst: per Drag&Drop aus Editor "rausziehen"
- Objekt-Hierarchie in Editorfenster draggen
- Aktuellen Desktop speichernMoritz
-
Super, funktioniert!
Recht schönen Dank!
