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 Ereignis OnAfterShow (https://www.delphipraxis.net/130541-ereignis-onaftershow.html)

Eurowig 10. Mär 2009 09:31


Ereignis OnAfterShow
 
Hi.
Eigentlich ein simples Problem.
Ein Form bekommt zur Designzeit das Propertie WindowsState = wsMaximized zugewiesen. Ich will die Größe meiner Form nach dem es das erste mal sichtbar wurde wissen.

Aber wie kann ich Height und Width des Forms rausfinden. In OnShow bekomme ich die alten Werte (also die Größe zur Designzeit). Wenn man in die Delphi Sourcen schaut, wird auch klar warum. Das Ereignis OnShow wird vor dem Zuweisen von WindowState gesendet.

Bisher meine Lösung, im OnResize einen Zähler abfragen:
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
  if ResizeCounter = 2 then // OnReszie wird beim ersten anzeigen 2-mal ausgelöst
  begin
    ... // Tu was, z.B. Controls anordnen
  end;

  Inc(ResizeCounter);
end;
Leider haben die Delphientwickler ein 'OnAfterShow' vergessen.
Gibt es da eine schönere Lösung?

thx

taaktaak 10. Mär 2009 09:41

Re: Ereignis OnAfterShow
 
.. eine eigene WM_AfterShow definieren und mit PostMessage() im OnShow senden

Eurowig 10. Mär 2009 09:52

Re: Ereignis OnAfterShow
 
und was soll das bringen???
Im OnShow geht doch nicht (siehe mein erster Beitrag)

mquadrat 10. Mär 2009 09:55

Re: Ereignis OnAfterShow
 
Das Einzige was mir noch einfallen würde wäre ein Timer, den man im onShow startet.

Satty67 10. Mär 2009 09:56

Re: Ereignis OnAfterShow
 
Schlagt mich für die seltsame VAriante, aber ich mache das immer so:
Delphi-Quellcode:
// FirstRun ist eine Bool-Variable im private des Formular

procedure TForm1.FormCreate(Sender: TObject);
begin
  FirstRun := True;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  if FirstRun then begin
    FirstRun := False;
    // Fenster Größe setzen
    WindowState := wsMaximized;
    Application.ProcessMessages;
    // einmaliges Initialisieren der Controls
    Label1.Caption := IntToStr(Width)+'x'+IntToStr(Height);
  end;
end;

taaktaak 10. Mär 2009 09:59

Re: Ereignis OnAfterShow
 
Zitat:

und was soll das bringen???
... den von dir gewünschten Effekt :mrgreen:

mquadrat 10. Mär 2009 10:06

Re: Ereignis OnAfterShow
 
Zitat:

Zitat von taaktaak
Zitat:

und was soll das bringen???
... den von dir gewünschten Effekt :mrgreen:

Wenn laut ihm WindowState erst nach dem onShow gesetzt wird, wird das Auslösen eines neuen Events im onShow auch nicht's nutzen ;) Das müsste er schon nach dem Setzen des WindowStates auslösen. Allerdings müsste er dafür in die Form Klasse und hätte somit keine releasesichere VCL mehr, wenn ich jetzt nicht arg aufm Schlauch steh.

Eurowig 10. Mär 2009 10:11

Re: Ereignis OnAfterShow
 
@taaktaak:
Sorry, du hast vielleicht sogar recht. :gruebel:

Die Message reiht sich im Windows Messagehandler 'hinten' an. Somit hat dann das Form wenn diese Message verarbeitet wird seine endgültige Größe. Wichtig ist hier wohl nur, dass das PostMessage() ganz am Ende von OnShow stattfindet und das Form schneller gezeichnet wird als die Message dran ist.

@mquadrat:
Ein Timer ist unter Umständen genauso problematisch. Dann bleich ich lieber bei meiner 'ResizeCount' Variante.

dfried 10. Mär 2009 10:13

Re: Ereignis OnAfterShow
 
Zitat:

Zitat von mquadrat
Wenn laut ihm WindowState erst nach dem onShow gesetzt wird, wird das Auslösen eines neuen Events im onShow auch nicht's ...

Hat ja auch niemand was von einem "neuen Event" geschrieben sondern vom "Senden einer Message" und damit geht das dann sehr wohl, da die MessageQueue erst abgearbeitet wird, wenn das setzen von WindowState auch schon rum ist.

taaktaak 10. Mär 2009 10:15

Re: Ereignis OnAfterShow
 
Also, ich mache das in verschiedenen Projekten auf diese Weise,
bisher hat es immer funktioniert.
- probiere es mal aus!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 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