![]() |
OnFormDestroy Frage "wirklich schließen"
Hallo allerseits,
ich möchte gerne eine den Benutzer fragen, ob ein Programm wirklich geschlossen werden soll, nachdem oben rechts auf das x geklickt oder das fenster mit alt+F4 geschlossen werden soll. meine idee war folgende: onFormDestroy:
Delphi-Quellcode:
Leider ist der effekt gleich null, da das programm sich schließt, bevor ich die meldung wirklichzu sehen bekomme. gibt es eine möglichkeit, OnFormdestry aufzuhalten? oder kann ich das irgendwie anders abfangen?
case MessageDlg('wirklich neustarten?', mtConfirmation, [mbyes, mbno], 0) of
mrYes: begin showmessage('yes'); end; mrNo: begin showmessage('no'); exit; end; end; Gruß Martin |
Re: OnFormDestroy Frage "wirklich schließen"
Hallo!
OnDestroy wird dann aufgerufen, wenn es bereits zu spät ist, um es mal kurz zu sagen. :zwinker: Probier mal OnCloseQuery. NACHTRAG:
Delphi-Quellcode:
Grüße
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin if MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then CanClose := False; end; Faux |
Re: OnFormDestroy Frage "wirklich schließen"
@faux: Der Dialog könnte evtl. anders geschlossen werden als mit Klick auf "Nein". Deshalb ist es hier meiner Meinung nach besser, das "Ja" abzufragen:
Delphi-Quellcode:
Gruß,
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) = mrYes; end; ManuMF |
Re: OnFormDestroy Frage "wirklich schließen"
...und wenn ich im MessageDialog auf das "x" klicke, wird das Hauptformular ebenfalls geschlossen :(
Die Abfrage sollte man besser so formulieren:
Delphi-Quellcode:
Gruß Hawkeye
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin if MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then CanClose := False; end; //Edit: @ManuMF: gleiche Idee, aber kleiner Fehler :wink: //Edit2: Mein Fehler :oops: |
Re: OnFormDestroy Frage "wirklich schließen"
Mache es so, wie ManuMF es vorschlug, so gehts.
Oder so:
Delphi-Quellcode:
Bleibt im Sinne egal, jenachdem wie man will. Ich bevorzuge eher ManuMF's Methode.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := False; if MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then CanClose := True; end; Grüße Faux |
Re: OnFormDestroy Frage "wirklich schließen"
Wenn man Formulare vererbt, kann es aber zu Problemen führen, wenn CanClose immer gesetzt wird:
Delphi-Quellcode:
Beim Aufruf der Routine aus der VCL heraus enthält die Variable CanClose den Wert True. Man muß also lediglich mitteilen, daß man das Schließen verhindern möchte.
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin // geerbter Aufruf inherited; // überschreibt eine Einstellung im geerbten Aufruf CanClose := MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) = mrYes; end; Gruß Hawkeye |
Re: OnFormDestroy Frage "wirklich schließen"
Wenn man vererbt, dann überschreibt man aber nicht die Eventhandler sonder die Methode der Form, die es aufruft, also die CloseQuery im Public Bereich von TCustomForm. Dann ist es schnurz egal wer nun in welcher Instanz sich einen Handler für das OnCloseQuery Event zugewiesen hat (vor allem: welcher der x Zuweisungen zuletzt drinne hängen geblieben ist, da sie sich ja gegenseitig rausschmeissen).
Wenn also ein Formular später mal abgeleitet werden kann, dann die CloseQuery Methode überschreiben - und vor allem kann man dann auch mit Inherited arbeiten... |
Re: OnFormDestroy Frage "wirklich schließen"
besten Dank, sowas hab ich gesucht. nun funktioniert auch meine anwendung:
Delphi-Quellcode:
case MessageDlg('Sollen beim Schließen die Einstellungen gespeichert werden?', mtConfirmation, [mbyes, mbno, mbcancel], 0) of mrYes: begin //sensordaten speichern CanClose := true; end; mrNo: begin //sensordaten nicht speichern CanClose := true; end; else begin //abbrechen.... CanClose := false; end; end;//case |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:03 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