Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OnFormDestroy Frage "wirklich schließen" (https://www.delphipraxis.net/67427-onformdestroy-frage-wirklich-schliessen.html)

happyaura 14. Apr 2006 09:25


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:
  case MessageDlg('wirklich neustarten?', mtConfirmation, [mbyes, mbno], 0) of
    mrYes:
      begin
        showmessage('yes');
      end;

    mrNo:
      begin
        showmessage('no');
        exit;
      end;
  end;
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?

Gruß Martin

faux 14. Apr 2006 09:27

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:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
    CanClose := False;
end;
Grüße
Faux

ManuMF 14. Apr 2006 09:40

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:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;
Gruß,
ManuMF

Hawkeye219 14. Apr 2006 09:40

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:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if MessageDlg('Wollen Sie wirklich beenden?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then
    CanClose := False;
end;
Gruß Hawkeye

//Edit: @ManuMF: gleiche Idee, aber kleiner Fehler :wink:

//Edit2: Mein Fehler :oops:

faux 14. Apr 2006 09:44

Re: OnFormDestroy Frage "wirklich schließen"
 
Mache es so, wie ManuMF es vorschlug, so gehts.
Oder so:

Delphi-Quellcode:
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;
Bleibt im Sinne egal, jenachdem wie man will. Ich bevorzuge eher ManuMF's Methode.

Grüße
Faux

Hawkeye219 14. Apr 2006 09:54

Re: OnFormDestroy Frage "wirklich schließen"
 
Wenn man Formulare vererbt, kann es aber zu Problemen führen, wenn CanClose immer gesetzt wird:

Delphi-Quellcode:
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;
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.

Gruß Hawkeye

Muetze1 14. Apr 2006 15:35

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...

happyaura 14. Apr 2006 18:38

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 15:20 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