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 Ein OnAfterCreate Event für die eigene Komponente (https://www.delphipraxis.net/94215-ein-onaftercreate-event-fuer-die-eigene-komponente.html)

Meflin 18. Jun 2007 10:46


Ein OnAfterCreate Event für die eigene Komponente
 
Moin moin!

Derzeit bastel ich an einer visuellen Komponente (Abgeleitet von TCustomControl), bei der es ganz nützlich wäre, wenn es ein OnAfterCreate-Event gäbe, das eben ausgeführt wird, nachdem die Instanz der Komponente vollständig erzeugt wurde.

Dazu habe ich mal folgenden Ansatz probiert:
Delphi-Quellcode:
    protected
      procedure AfterCreate(var Msg: TMessage); message WM_USER + 104;
Delphi-Quellcode:
constructor Wuppdi.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 150;
  Height := 150;
  PostMessage(Handle, WM_USER + 104, 0, 0);  // trigger AfterCreate event
end;
Allerdings ergeben sich da zwei Probleme:

1. Es funktioniert nicht :mrgreen: . Obwohl ein CustomControl ja eigentlich Messages empfangen können müssten, gibt es eine Exception (Ich glaube es war "Element "" hat kein übergeordnetes Fenster).

2. Mal angenommen es würde gehen - dann würde ja beim Erzeugen einer Instanz jede schon vorhandene Instanz wieder das AfterCreate-Event auslösen. Gibt es eine elegantere Lösung als noch einen zusätzlichen "Schalter" einzubauen, der überprüft, ob die Instanz schonmal das Event ausgelöst hat?


DeddyH 18. Jun 2007 10:51

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Hallo, wenn ich mich nicht irre, ist dafür die Prozedur "Loaded" zuständig.

Hawkeye219 18. Jun 2007 11:01

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Hallo,

Zitat:

Zitat von Meflin
[...]bei der es ganz nützlich wäre, wenn es ein OnAfterCreate-Event gäbe, das eben ausgeführt wird, nachdem die Instanz der Komponente vollständig erzeugt wurde.

Die Programmierer der VCL haben dafür die virtuelle Methode Delphi-Referenz durchsuchenTObject.AfterConstruction vorgesehen. Sie wird automatisch aufgerufen, nachdem der letzte Konstruktor des Objekts ausgeführt wurde.

Gruß Hawkeye

Meflin 18. Jun 2007 11:03

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Mööp mööp :???: Wieso findet man sowas immer erst nachdem man es stundenlang anders probiert hat :stupid:

Unabhängig davon würde mich aber weiterhin interessieren, wo es an meiner Methode hakt!


dataspider 18. Jun 2007 11:35

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Hi,

ich würde sagen, du verwechselst Events und Messages.
Du willst deiner Klasse selbst eine Nachricht schicken. Was willst du damit erreichen?

Willst du einen Event, dann musst du ein Property vom Typ (z.B. TNitifyEvent) deklarieren.

Cu, Frank

[EDIT]
Delphi-Quellcode:
  TmyControl = class(TCustomControl)
  private
    FOnCreate: TNotifyEvent;
  public
    procedure AfterConstruction; override;
  published
    property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
  end;

implementation

procedure TmyControl.AfterConstruction;
begin
  inherited;
  if Assigned(FOnCreate) then
    FOnCreate(Self);
end;

Meflin 18. Jun 2007 11:41

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Zitat:

Zitat von dataspider
ich würde sagen, du verwechselst Events und Messages.
Du willst deiner Klasse selbst eine Nachricht schicken. Was willst du damit erreichen?

Ganz einfach: im Constructor wird via PostMessage die message gesendet - und ist damit ganz am Ende der Message-Queue. Kommt die Message an wird die OnAfterCreate-Procedure aufgerufen (oder sagen wir mal: sollte aufgerufen werden).

Der Zeitpunkt des Aufrufens läge dann eben zu einem Zeitpunkt, wo die Instanz fertig instanziert ist (da ja zuerst alle anderen messages abgearbeitet werden, bevor meine ankommt).

Wie nennt sich das? Ein Event :stupid:


juergen 18. Jun 2007 18:49

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Hallo,
etwas später hatte heute Lucky genau dazu einen interessanten Post:

OnAfterShow mittels Postmessage

Meflin 18. Jun 2007 19:08

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Zitat:

Zitat von juergen
etwas später hatte heute Lucky genau dazu einen interessanten

Ja, der war mir auch schon aufgefallen. Allerdings mache ich das ja bereits so wie shmia es vorschlug :gruebel:

Ich verstehe also nicht wieso das PostMessage bei mir einen Fehler auslöst. Das customControl müsste doch ein zum Empfang fähiges Window sein :?


Muetze1 18. Jun 2007 19:12

Re: Ein OnAfterCreate Event für die eigene Komponente
 
PostMessage möchte die Message sofort einreihen bei seinem Aufruf aber dein Control ist noch im Constructor. Das CreateWindow() wird aber erst danach aufgerufen, von daher gibt es noch kein Window Handle und somit kann PostMessage die Nachricht nicht einreihen, da das Handle nicht gültig ist / existiert.

Du kannst gerne mal im Constructor vor dem PostMessage das Ergebnis von IsWindow(Handle) ausgeben lassen.

Meflin 18. Jun 2007 20:32

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Das erklärt einiges - dankeschön :)


SirThornberry 18. Jun 2007 20:37

Re: Ein OnAfterCreate Event für die eigene Komponente
 
dein TCustomControl bekommt in aller Regel erst mit Zuweisung eines Parents das Handle

Meflin 18. Jun 2007 20:40

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Zitat:

Zitat von SirThornberry
dein TCustomControl bekommt in aller Regel erst mit Zuweisung eines Parents das Handle

Ich werde jetzt erstmal ausloten ob das OnAfterConstruction für meine Zwecke dienlich ist. Sollte das der Fall sein werde ich mir dieses PostMessage rumgefriemel sparen. wenn nicht werde ich mich dann mal nach einer anderen Lösung umsehen müssen.

Aber das Setzen des Parents abzufangen dürfte ja kein Problem darstellen.


SirThornberry 18. Jun 2007 20:43

Re: Ein OnAfterCreate Event für die eigene Komponente
 
willst du den Moment haben wo dein Fenster das Handle hat. Nur das setzen des Parents abfangen bringt dir da nichts weil ja der parent evenutell noch kein Parent hat. Sinnvoll wäre es also CreateWnd zu überschreiben.
Delphi-Quellcode:
begin
  inherited; //Fenster hat jetzt ein Handle
  //jetzt irgendwas machen was das Handle vorraus setzt
end;

Meflin 18. Jun 2007 20:47

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Alles klar - und nochmal dankeschön


Muetze1 18. Jun 2007 23:44

Re: Ein OnAfterCreate Event für die eigene Komponente
 
Aber beachte, das diese Methode mehrfach aufgerufen werden kann. Unter anderem bei der - leider - beliebten Unart den FormStyle zur Laufzeit zu ändern. Damit wird dann auch (wie auch bei anderen Eigenschaftsänderungen) das Fenster zerstört und erneut angelegt. Aber mit dem CreateWnd hast du immer ein gültiges und aktuelles Handle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

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