68 Stimmen

Delphi/Lazarus: "Wollen Sie wirklich beenden?"-Dialog beim Schließen einer Form anzeigen

Info von Stefan Trost | Letztes Update am 19.01.2023 | Erstellt am 29.03.2013

Wenn ein Nutzer seine Eingaben, seine Änderungen oder seine sonstigen Arbeiten in einer Anwendung nicht gespeichert hat und versucht das Programm oder das betreffende Fenster zu schließen, ist es manchmal gewünscht einen Dialog wie "Sie haben Ihre Änderungen noch nicht gespeichert. Wollen Sie das Programm wirklich beenden?" anzuzeigen. In diesem Tutorial zeige ich euch, wie ihr ein solches Hinweisfenster mit Delphi oder Lazarus realisieren könnt.

Wir implementieren die Anzeige unseres Dialogs im OnCloseQuery-Event unserer Form. Dazu klicken wir auf unsere Form und suchen im Objekt-Inspektor die entsprechende Prozedur heraus. OnCloseQuery wird jedes mal ausgeführt, bevor eine Form geschlossen wird und wir können hier noch Einfluss darauf nehmen, ob die Form wirklich geschlossen werden darf.

Unsere OnCloseQuery-Prozedur könnte zum Beispiel so aussehen:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  AMsg: String;
begin
  AMsg := 'Sie haben Ihre Änderungen nicht gespeichert. Wollen Sie wirklich beenden?';

  if MessageDlg(AMsg, mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then 
    CanClose := false;
end; 

Setzen wir innerhalb von OnCloseQuery die Variable CanClose auf false, wird das Fenster nicht geschlossen und der Nutzer gelangt zurück zum Programm. Wir zeigen dem Nutzer einen Message-Dialog an, in dem der Nutzer entweder auf "OK" (schließen) oder "Abbrechen" (nicht schließen) klicken kann. Gibt der Dialog "mrCancel" zurück, das heißt es wurde auf "Abbrechen" geklickt, wird CanClose auf false gesetzt und der Nutzer kehrt zum Programm zurück.

Prüfung auf Änderungen

Natürlich kann man diesen Code noch dahingehend verbessern beziehungsweise erweitern, dass die Meldung nur angezeigt wird, wenn tatsächlich auch Änderungen vorgenommen wurden und diese noch nicht gespeichert wurden.

Dazu kann man eine globale Variable (zum Beispiel könnte man sie "isSaved" nennen) einführen, die zu Beginn auf "true" steht und bei jeder Änderung auf "false" gesetzt wird. Sobald der Nutzer seine Änderungen speichert wird die Variable wieder auf "true" gesetzt und das Spiel beginnt mit den ersten Änderungen von vorn. Im OnCloseQuery-Event wird dann die Meldung nur angezeigt, wenn die Variable auf "false" steht, also wirklich noch nicht abgespeichert wurde.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Delphi: Systemweiter HotKey

Tutorial | 3 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.