Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XE7 ignoriert Form AfterCreate (https://www.delphipraxis.net/195090-delphi-xe7-ignoriert-form-aftercreate.html)

enricoffo 31. Jan 2018 16:59

Delphi XE7 ignoriert Form AfterCreate
 
Hallo,

ich nutze diesen Tipp seit Delphi5:
http://www.swissdelphicenter.com/de/...de.php?id=1276

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.

Bernhard Geyer 31. Jan 2018 17:15

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.

himitsu 31. Jan 2018 18:28

AW: Delphi XE7 ignoriert Form AfterCreate
 
Hier im Forum suchenOldCreateOrder / Bei Google suchenTForm OldCreateOrder

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.

OLDIE1950 31. Jan 2018 19:46

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.

DeddyH 31. Jan 2018 19:48

AW: Delphi XE7 ignoriert Form AfterCreate
 
Dann schau mal nach AfterCreation.

himitsu 31. Jan 2018 19:49

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:

jbg 31. Jan 2018 20:23

AW: Delphi XE7 ignoriert Form AfterCreate
 
Zitat:

Zitat von himitsu (Beitrag 1392795)
Aber OnShow ist doch schon immer ein "After" ?

Nein. Es wird (direkt) vor dem ShowWindow() Aufruf aufgerufen. Visible ist zwar bereits True, aber IsWindowVisible liefert noch False und Showing ist ebenfalls noch False.

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.

DeddyH 31. Jan 2018 20:37

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 06:42 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