![]() |
Delphi XE7 ignoriert Form AfterCreate
Hallo,
ich nutze diesen Tipp seit Delphi5: ![]() Nun sind wir auf Delphi XE7 umgestiegen und ich habe folgendes Problem: Delphi führt zwar noch AfterShow aus, aber AfterCreate wird nie ausgelöst... Kann das jemand nachvollziehen oder ist das bekannt? Oder besser, warum ist das so? Vielen Dank für Eure Hilfe. |
AW: Delphi XE7 ignoriert Form AfterCreate
Die besser Frage ist: Was willst du damit erreichen? Vor allem beim AfterCreat erschließt sich mit nicht der Nutzen.
|
AW: Delphi XE7 ignoriert Form AfterCreate
![]() ![]() In den Jahren nach D5 wurde die Reihenfolge des OnCreate/OnDestroy geändert, im Verhältnis zu Laden/Freigeben der DFM/Komponenten. Also im Prinzip wüsste ich nicht, wozu man jetzt noch ein AfterCreate braucht ... ich vermute das war damals ein Bugfix, damit OnCreate aka AfterCreate nach dem DFM-Laden kommt. Wenn ihr die Form einfach upgegradet habt, dann solltet ihr noch das Property umstellen (False). Vom Prinzip her sollte es aber noch funktionieren, ABER du wirst es nicht glauben. PostMessage hat ein Result, dass man auswerden kann, ob die Message wirklich erfolgreich gesendet wurde. PS: Wenn nochmal kurz das Windows-Handle freigegeben würde, dann werden auch alle Messages gelöscht. Du könntest TForm.DestroyWindowHandle und TForm.CreateWindowHandle überschreiben und schauen ob sowas passiert. |
AW: Delphi XE7 ignoriert Form AfterCreate
Du hast wahrscheinlich vergessen, die Proceduren im Objektinspektor einzutragen.
Das *.dfm-File muss dann so aussehen: object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 201 ClientWidth = 447 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 end
Code:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; const WM_AFTER_SHOW = WM_USER + 300; // custom message WM_AFTER_CREATE = WM_USER + 301; // custom message type TForm1 = class(TForm) // OnShow event procedure FormShow(Sender: TObject); // OnCreate event procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW; procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WmAfterShow(var Msg: TMessage); begin ShowMessage('WM_AFTER_SHOW received!'); end; procedure TForm1.WmAfterCreate(var Msg: TMessage); begin ShowMessage('WM_AFTER_CREATE received!'); end; procedure TForm1.FormShow(Sender: TObject); begin // Post the custom message WM_AFTER_SHOW to our form PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0); end; procedure TForm1.FormCreate(Sender: TObject); begin // Post the custom message WM_AFTER_CREATE to our form PostMessage(Self.Handle, WM_AFTER_CREATE, 0, 0); end; end. |
AW: Delphi XE7 ignoriert Form AfterCreate
Dann schau mal nach AfterCreation.
|
AW: Delphi XE7 ignoriert Form AfterCreate
Das ist ja auch selbstgebaut, sie Link in #1 :zwinker:
Aber OnShow ist doch schon immer ein "After" ? Das wird aufgerufen, nachdem die Form angezeigt wurde. :stupid: |
AW: Delphi XE7 ignoriert Form AfterCreate
Zitat:
Anstatt dieses AfterCreate könnte man doch auch einfach die Methode AfterConstruction überschreiben und nach dem "inherited AfterConstruction;", dass das OnFormCreate auslöst, den Code schreiben. |
AW: Delphi XE7 ignoriert Form AfterCreate
Thx, AfterConstruction hatte ich auch gemeint, aber AfterCreation geschrieben. Ich werde wirklich alt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 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