Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponentenerstellung: Prozedur wenn Programm gestartet wird (https://www.delphipraxis.net/70986-komponentenerstellung-prozedur-wenn-programm-gestartet-wird.html)

Martin K 7. Jun 2006 16:29


Komponentenerstellung: Prozedur wenn Programm gestartet wird
 
Hi,

hab mir eine Komponente abgeleitet und würde dort gerne Befehle ausführen, sobald das Programm compiliert wird.
Wollte es erst so machen, dass ich im Constructor abfrage if not (csDesigning in ComponentState), aber anscheinend wird der Contructor nur zur Designzeit ausgeführt.

Hat jemand eine Idee? :gruebel:

mkinzler 7. Jun 2006 17:02

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Wass willst du bei der Compilierung ausführen?
Zitat:

aber anscheinend wird der Contructor nur zur Designzeit ausgeführt.
Er wird definitiv zur Laufzeit ausgeführt.

Martin K 7. Jun 2006 17:14

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Zitat:

Zitat von mkinzler
Wass willst du bei der Compilierung ausführen?
Zitat:

aber anscheinend wird der Contructor nur zur Designzeit ausgeführt.
Er wird definitiv zur Laufzeit ausgeführt.

Hm, also ich verstehe grad meinen eigenen Code nicht.

Im Constructor lege ich doch verschiedene Properties fest (z.B. Caption := 'Test').
Wenn ich dann aber die Caption im OI (also zur Designzeit) ändere, so steht dann bei compilierten Programm (also zur Laufzeit) die geänderte Caption da.
Also wird doch beim Compilieren die Caption nicht in 'Test' geändert, wie es im Constructor steht.
Folglich wird beim Compilieren der Constructor nicht durchlaufen oder sehe ich da jetzt was komplett falsch ???

shmia 7. Jun 2006 17:20

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Zitat:

Zitat von Martin K
Folglich wird beim Compilieren der Constructor nicht durchlaufen oder sehe ich da jetzt was komplett falsch ???

Der Constructor wird ausgeführt!
Danach werden die Properties, die in der DFM-Datei gespeichert wurden den Komponenten zugewiesen.
Danach wird die virtuelle Prozedur Loaded ausgeführt. Du kannst diese überladen, wenn du direkt nachdem die Komponente seine Properties erhalten hat noch etwas tun möchtest.

Dax 7. Jun 2006 17:21

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Zitat:

Zitat von Martin K
Folglich wird beim Compilieren der Constructor nicht durchlaufen oder sehe ich da jetzt was komplett falsch ???

Tust du. Der Constructor wird auf jeden Fall ausgeführt, aber alle (oder zumindest viele) Eigenschaften der Komponente, die man im OI ändern kann, werden in die dfm-Datei und damit ins Programm geschrieben. Zur Laufzeit wird deine Komponente also ganz normal erstellt, nur bügelt der Form-Loader nochmal gemütlich drüber, also siehst du zB von der Caption 'Test' letzten endes nix mehr ;)

Tu doch mal ein ShowMessage in den Constructor, dann siehst dus auch :)

Martin K 7. Jun 2006 17:32

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Danke :thumb: , jetzt hab ich das Prinzip verstanden!
Also erst Constructor durchlaufen, dann Properties aus dfm laden!

Mein Problem liegt darin, dass ich im Constructor zunächst die Property auf den Default-Wert setze.
Danach frage ich den Wert ab (auch noch im Constructor) und es kommt natürlich wieder de Default-Wert raus, obwhol er im OI geändert wurde.
Wie kann ich dann diesen geänderten Wert (der ja in der dfm steht) beim Compilieren erhalten,
das müsste dann also mit Loaded gehen?
Wie und wo muss ich denn Loaded deklarieren?

//Edit:
Oder kann ich irgendwie anders, die Werte aus der dfm im Constructor erhalten - oder ist das überhaupt nicht möglich?

shmia 7. Jun 2006 17:39

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Zitat:

Zitat von Martin K
Wie und wo muss ich denn Loaded deklarieren?

Delphi-Quellcode:
TMeineKompi = class(TComponent)
...
protected
   procedure Loaded;overload;
end;
....
procedure TMeineKompi.Loaded;
begin
   // wenn das Property verändert wurde, dann irgendwas nettes tun
   if Caption<>'default caption' then
      Caption := '***'+Caption+'***';
end;

Martin K 7. Jun 2006 17:50

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Zitat:

Zitat von shmia
Delphi-Quellcode:
TMeineKompi = class(TComponent)
...
protected
   procedure Loaded;overload;
end;
....
procedure TMeineKompi.Loaded;
begin
   // wenn das Property verändert wurde, dann irgendwas nettes tun
   if Caption<>'default caption' then
      Caption := '***'+Caption+'***';
end;

Sicher, dass es nicht override heißen muss?
Zitat:

[Warnung] Methode 'Loaded' verbirgt virtuelle Methode vom Basistyp 'TCustomLabel'

Dax 7. Jun 2006 17:51

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Delphi-Quellcode:
..;overload;...
Da gehört eher ein override; hin :)

Martin K 7. Jun 2006 17:55

Re: Komponentenerstellung: Prozedur wenn Programm gestartet
 
Danke!

Jetzt klappt's!!!
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz