Frage zu __property
-
Hi Fans,
in einer Kompo werden ja bekannterweise __property Anweisungen verwendet. Für float-Propertys kann man aber nicht explizit default-Floatwerte einsetzen, sondern int.
Beispiel:
__property float RAP_XMin = {read = GetXMin, write = SetXMin, default = -10};Setzt man statt "default = -10" "default = -10.0" erscheint eine Fehlermeldung beim Compilieren a la:
[C++ Fehler] Rasterpanel.h(182): E2313 Konstantenausdruck erforderlich
Warum
?Außerdem habe ich das Phänomen, dass wenn zuvor im OI die Werte auf 0 gesetzt werden, dann nach dem Starten der Anwendung alle auf 0 gesetzten Werte nicht initialisiert werden, d.h. die Set-Funktion der Property wird nicht aufgerufen. Bei anderen Werten ja.
-
Meiner Erinnerung nach, bezieht sich der default-Wert, nicht auf den Wert, mit der die property initialisiert wird. Das muss im Konstruktor gesetzt werden. Der default-Wert wird nur benutzt, wenn du die Komponente auf einer Form hast und diese in der IDE gespeichert wird. Ist das aktuelle Value gleich dem default-Value, wird diese property nicht expliziet mit in die Form-Beschreibungs-Datei (*.dfm) gespeichert.
Mit dem eigendlichen Problem kann ich dir aber nicht weiter helfen
Dein letzteres Problem könnte sich evtl. auch auf dieses Phänomen der default-Values beziehen. Da keine Werte in der *.dfm stehen, werden die Setter nicht aufgerufen... (Gesetz dem Fall, das default=0 ist)
mfg
xXx
-
Das mit der Vorinitialisierung im Konstruktor ist mir mittlerweile auch soweit klar.
Der Ablauf ist in der Regel folgender:
1. Konstruktor: (meine Defaultwerte werden gesetzt)
2. Set-Funktionen der __propertys: Alle Set-Funktionen, außer derer, die im OI den Wert 0 haben werden aufgerufen
3. Loaded(): (Zus. Draw-Aufrufe für das Panel-Gitter)Hat sich also am eigentlichen Problem noch nichts geändert.

-
Naja, zu 2:
Schau dir mal die *.dfm in z.b. Notepad an (bzw. im BCB gibts glaub ich auch die Option "Fenster als Text anzeigen"). Dort werden vermutlich alle Properties deren Value 0 ist nicht aufgeführt sein. Default für die Properties ist vermutlich 0, ob du es nun explizit angibts, oder nicht....
Dementsprechend werden sie nicht gelesen und auch der Setter nicht aufgerufen. Warum _muss_ denn der Setter aufgerufen werden?edit:
Laut BDS-Hilfe gibts auch noch nodefault. Damit dürfte immer ein Value gespeichert werden und somit auch der Setter aufgerufen werden.mfg
xXx
-
Der Aufruf mit 0 ist wichtig um das Gitter vorzuinitialisieren, also den Bereich von z.B. xmin bis xmax zu zeichnen usw. In der entspr. SetMethode wird dazu der Wert gesetzt und dann die Draw Funktion zum Neuzeichnen aufgerufen.
Gestern habe ich nochmal mit einem Kollegen geredet, der hantiert mit Delphi 7. Dort ist es ebenfalls nicht möglich bei Double-Properties den Defaultwert mit Kommazahlen ("1.0", "0.56") zu initialisieren. Auch ganzzahlige Defaultwerte werden, im Gegesatz zum BCB, vom Delphicompiler abgelehnt.

Zufällig hatten wir ein Kochbuch für Delphi 3 zur Hand, wo die Entwicklung einer Gitterkomponente dargestellt wird. Schlauerweise wird dort anstatt der Float/Double Werte der Datentyp AnsiString verwendet und in den Get und SetMethoden immer zw. AnsiString und double konvertiert.
Es wird aber nicht genau beschrieben, warum. Sondern nur, das es eben nicht anders geht. 
-
Ich habe jetzt wirklich nochmal alles durchgetestet: default=0, nodefault (funktioniert absolut nicht), stored = true usw. Funktioniert wirklich nur zuverlässig bei AnsiString. Performance-Nachteil ist die Konvertierung mit FloatToStr in den get und StrToFloat bei den Set-Fkt.
-
Noch 'ne Frage:
Die Kompo ist von TPanel abgelitten. Zum Beschriften meiner Achsen benutze ich die akt. Font vom TPanel. Wenn der Benutzer nun im OI die Font ändert, wie kann ich dann darauf reagieren, so dass die Achsenbeschriftungen gleich mit der neu eingestellten Font gezeichnet werden? Irgendwie müßte ich ja die originale Panel-Property so verbiegen, dass noch ein Redraw() mit eingeschliffen wird. Wie komme ich an diese Panel-Property ran?