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 Form schließt sich nicht mit Close (https://www.delphipraxis.net/91813-form-schliesst-sich-nicht-mit-close.html)

messie 10. Mai 2007 11:21


Form schließt sich nicht mit Close
 
Hallo,

ich beschreibe ein Form im OnShow. Geht dabei etwas schief, soll das Form über einen Timer geschlossen werden. Habe ich schon häufig gemacht (ist nicht besonders schön aber einfach), jetzt funktioniert das nicht.

Was wird denn alles abgearbeitet beim FormClose ausser FormCloseQuery?

Danke, Messie

marabu 10. Mai 2007 11:43

Re: Form schließt sich nicht mit Close
 
Hallo,

warum nimmst du einen Timer? Kannst du nicht einfach die Methode Release() anstatt Close() aufrufen?

Grüße vom marabu

Matze 10. Mai 2007 11:46

Re: Form schließt sich nicht mit Close
 
Moin

um dennoch auf deine Frage zurückzukommen:
Zitat:

Zitat von messie
Was wird denn alles abgearbeitet beim FormClose ausser FormCloseQuery?

Siehe Ablauf der Events beim Erzeugen/Schliessen eines Formulares.

daddy 10. Mai 2007 11:51

Re: Form schließt sich nicht mit Close
 
Was prüfst Du denn im "OnShow"? Lässt sich das nicht auch schon im "OnCreate" prüfen? Falls ja, könntest Du für den Fall, dass Du das Formular gar nicht anzeigen möchtest, eine Exception auslösen. Die musst Du dann nur im aufrufenden Formular abfangen. Dies führt insgesamt zu einer ruhigeren Bildschirmndarstellung, da das Formular erst gar nicht erscheint.

Gruß Daddy

Phoenix 10. Mai 2007 12:03

Re: Form schließt sich nicht mit Close
 
Wenn Du ein MDI-Form hast, dann geht close nicht. Dann musst Du den DialogResult setzen und die Action im OnCloseQuery auf caFree.

messie 10. Mai 2007 15:04

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von marabu
warum nimmst du einen Timer? Kannst du nicht einfach die Methode Release() anstatt Close() aufrufen?

Release kann ich auch nicht im OnShow aufrufen. Jedenfalls sagte mir das die Fehlermeldung, als ich es probiert habe. Danach wurde das Form gezeigt. Ausserdem hätte ich mit dem Befehl die Routinen aus OnClose nochmal ins OnShow kopieren müssen.
Zitat:

Zitat von daddy
Lässt sich das nicht auch schon im "OnCreate" prüfen?

Nee, die Daten werden direkt vor dem Aufruf des Forms festgelegt
Zitat:

Zitat von Phoenix
Wenn Du ein MDI-Form hast...

Habe ich nicht.

Zumal das mit dem timer schon häufig funktioniert hat, auch wenns nicht schön ist weil es doch kurz flackert. Aber ich zoome das Fenster sowieso im OnResize auf Bildschirmgröße, da flackerts gelegenlich sowieso. Vielleicht haut mir das auch dazwischen...
Eine Funktion Form.OnShowQuery wäre das richtige.

Grüße, Messie

Gremlin 10. Mai 2007 15:28

Re: Form schließt sich nicht mit Close
 
Warum schickst du dir nicht selbst im FormShow eine Message, die dann dein FormClose aufrufen kann, somit sparst du dir den Timer?

BTW: Eigentlich sollte vor dem Anzeigen der Form geprüft werden, ob alle Anforderungen erfüllt werden.
Ist dies nicht möglich, dann sollte dies wenigstens nach dem FormShow im Formular passieren und entsprechend
ein Hinweis auf mögliche Fehlerursachen angezeigt werden.

messie 10. Mai 2007 15:38

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von Gremlin
Warum schickst du dir nicht selbst im FormShow eine Message, die dann dein FormClose aufrufen kann, somit sparst du dir den Timer?

Weil ich das noch nie gemacht habe....

daddy 10. Mai 2007 15:41

Re: Form schließt sich nicht mit Close
 
Was meinst Du mit:

Zitat:

Nee, die Daten werden direkt vor dem Aufruf des Forms festgelegt
Falls es im "Create" noch nicht geht, könntest Du ja evtl. auch "Loaded" überschreiben und dort bei Bedarf eine Exception auslösen. Wovon ist denn die Anzeige des Formulars abhängig?

Gruß Daddy

Gremlin 10. Mai 2007 15:58

Re: Form schließt sich nicht mit Close
 
Zitat:

Zitat von messie
Zitat:

Zitat von Gremlin
Warum schickst du dir nicht selbst im FormShow eine Message, die dann dein FormClose aufrufen kann, somit sparst du dir den Timer?

Weil ich das noch nie gemacht habe....


Delphi-Quellcode:
const
  WM_CloseMeNow = WM_USER+1;

type
  [...]
  private
    procedure FormCloseMeNow(var Msg:TMessage); message WM_CloseMeNow;
  public
  [...]

procedure TForm1.FormShow(Sender: TObject);
begin
  [...]
  PostMessage(Handle, WM_CloseMeNow, 0, 0);
end;

procedure TForm1.FormCloseMeNow(var Msg:TMessage);
begin
  Close;
end;


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