Wann werden die Properties einer neuen Kompo gesetzt?

Rund um die LCL und andere Komponenten
Antworten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Wann werden die Properties einer neuen Kompo gesetzt?

Beitrag von braunbär »

ich habe eine Komponente TfdEdit von TEdit abgeleitet.
Im Konstruktor Create von TfdEdit rufe ich als erstes "inherited" auf. Leider sind nach der Rückkehr vom "Inherited Create" die Properties, die im OI gesetzt worden sind, immer noch leer.
Wann werden die initialisiert, bzw. wann ist der frühest mögliche Zeitpunkt, zu dem man auf diese Properties zuzugreifen kann?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Wann werden die Properties einer neuen Kompo gesetzt?

Beitrag von wp_xyz »

Properties, die im Object Inspector erscheinen sollen, müssen als "published" deklariert werden. Machst du das so? Daneben ist es noch wichtig, ihre Default-Werte im Create-Constructor festzulegen. Oft möchte man aus Kompatibilitätsgründen Properties nur dann in der lfm-Datei, wenn sein Wert nicht dem Default-Wert entspricht; dazu muss man die Direktive "default" verwenden, bzw. es muss eine funktion a la "IsStoredXXXX()" vorhanden sein, die true zurückgeben muss, wenn das Property in die lfm-Datei geschrieben werden soll.

Schau dir den LCL-Quellcode an - da findest du Unmengen von Beispielen.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Wann werden die Properties einer neuen Kompo gesetzt?

Beitrag von mse »

braunbär hat geschrieben:Wann werden die initialisiert,

In "TComponent.ReadState()" aufgerufen vom Streaming Mechanismus des Formulars.
bzw. wann ist der frühest mögliche Zeitpunkt, zu dem man auf diese Properties zuzugreifen kann?

In TComponent.Loaded() oder ReadState() nach Aufruf von inherited. Nach ReadState() sind Eigenschaften vom Typ TComponent in der Regel noch nicht gelinkt.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Wann werden die Properties einer neuen Kompo gesetzt?

Beitrag von braunbär »

mse hat geschrieben:In TComponent.Loaded()

D.h. in der Form gibt es keine Methode, die aufgerufen wird, wenn alle Komponenten fertig sind.
OK. ist auch nicht wirklich schlimm. Ich wollte im OnCreate ein paar Testausgaben in eine Debug-Datei schreiben, weil irgendwas nicht so läuft, wie ich es mir vorgestellt habe (und leider gefühlsmässig der GDB ziemlich unbrauchbar ist) - dann muss ich das eben statt dessen im Loaded der Komponenten machen.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Wann werden die Properties einer neuen Kompo gesetzt?

Beitrag von mse »

Doch, Loaded(). OnCreate wird vermutlich auch aufgerufen, nachdem die Komponenten geladen wurden, auf jeden Fall ist das in MSEgui so. Dann gibt es noch OnLoaded.
gdb kombiniert mit einer IDE ist ist gut zu arbeiten, wenn man auf die Eigenarten des Verbunds Free Pascal - gdb Rücksicht nimmt.

Antworten