![]() |
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:
Allerdings ergeben sich da zwei Probleme:
constructor Wuppdi.Create(AOwner: TComponent);
begin inherited Create(AOwner); Width := 150; Height := 150; PostMessage(Handle, WM_USER + 104, 0, 0); // trigger AfterCreate event end; 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? |
Re: Ein OnAfterCreate Event für die eigene Komponente
Hallo, wenn ich mich nicht irre, ist dafür die Prozedur "Loaded" zuständig.
|
Re: Ein OnAfterCreate Event für die eigene Komponente
Hallo,
Zitat:
![]() Gruß Hawkeye |
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! |
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; |
Re: Ein OnAfterCreate Event für die eigene Komponente
Zitat:
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: |
Re: Ein OnAfterCreate Event für die eigene Komponente
Hallo,
etwas später hatte heute ![]() ![]() |
Re: Ein OnAfterCreate Event für die eigene Komponente
Zitat:
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 :? |
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. |
Re: Ein OnAfterCreate Event für die eigene Komponente
Das erklärt einiges - dankeschön :)
|
Re: Ein OnAfterCreate Event für die eigene Komponente
dein TCustomControl bekommt in aller Regel erst mit Zuweisung eines Parents das Handle
|
Re: Ein OnAfterCreate Event für die eigene Komponente
Zitat:
Aber das Setzen des Parents abzufangen dürfte ja kein Problem darstellen. |
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; |
Re: Ein OnAfterCreate Event für die eigene Komponente
Alles klar - und nochmal dankeschön
|
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