Delphi-PRAXiS
Seite 1 von 2  1 2      

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 :)



Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.
Seite 1 von 2  1 2      

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