Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   CanClose (https://www.delphipraxis.net/177863-canclose.html)

Luki206 2. Dez 2013 16:21

CanClose
 
Hi,
ich habe folgendes Problem: ich möchte das bei OnClose meines Fensters eine Überprüfung machen ob das Fenster wirklich geschlossen werden sollte, nur klappt das nicht ganz.. Ich muss dazu sagen ich möchte das wenn der Benutzer, ja wählt, das eine kleine .txt Datei erstellt werden soll. Bis jetzt sieht das ganze so aus:
Delphi-Quellcode:
procedure TFrmHaupt.FormClose(Sender: TObject; var Action: TCloseAction);
var
sl : TStringList;
s, d, z: String; mr: Integer; CanClose: Boolean;
begin
 mr := MessageDlg('Wirklich schließen???',mtConfirmation,[mbYes,mbNo],0);
   if mr = mrYes {mrNo} then begin
   if LblGesammt.Caption = '0' then begin
   MessageDlg('Es konnte kein Gesammt Protokoll angelegt werden, da keine Waffeln gebucht worden sind.', mtWarning, [mbOK], 0);
   CanClose := true;
   end else begin
   d := DateToStr(date);
   z := System.SysUtils.FormatDateTime('"Gesammt Protokoll " hh-nn-ss  dd, mm, yyyy' , (Now));
   s := (LblGesammt.Caption);
   sl:=TStringList.Create;
   try
     sl.Add('Es wurden '+s+' Waffeln produziert und verkauft.');
     sl.SaveToFile('c:\ProgramData\Crepesworker\Protokoll '+d+'\'+z+'.txt');
   finally
     sl.Free;
   end;
   end;
   CanClose := true;
end else
 CanClose := false;
end;
Das ganze dient eher nur zum 'spielen und experimentieren' als das es wirklich in gebrauch genommen wird ;)
Danke
Gruß
Luki :)

mkinzler 2. Dez 2013 16:23

AW: CanClose
 
Warum nimmst du nich den CloseQuery-Event?

Luki206 2. Dez 2013 16:28

AW: CanClose
 
geht es damit besser?

Edit: Ok, mit CloseQuery geht es ;)

Luki206 2. Dez 2013 16:37

AW: CanClose
 
Naja, jetzt ist nur das Problem: wie bekomme ich das in eine ButtonClick procedure? Weil irgendwie geht mein Fenster jetzt nicht zu wenn ich dann auf 'Ja' drück.. :?:

Der schöne Günther 2. Dez 2013 16:44

AW: CanClose
 
Zeig bitte nochmal deinen Quelltext wie er jetzt ist. Sowohl das OnCloseQuery-Event als auch das, was beim Druck auf deinen Button passiert.

Luki206 2. Dez 2013 16:50

AW: CanClose
 
OnCloseQuery:
Delphi-Quellcode:
procedure TFrmHaupt.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
sl : TStringList;
s, d, z: String; mr: Integer;
begin
 mr := MessageDlg('Wirklich schließen???',mtConfirmation,[mbYes,mbNo],0);
   if mr = mrYes {mrNo} then begin
   if LblGesammt.Caption = '0' then begin
   MessageDlg('Es konnte kein Gesammt Protokoll angelegt werden, da keine Waffeln gebucht worden sind.', mtWarning, [mbOK], 0);
   CanClose := true;
   end else begin
   d := DateToStr(date);
   z := System.SysUtils.FormatDateTime('"Gesammt Protokoll " hh-nn-ss  dd, mm, yyyy' , (Now));
   s := (LblGesammt.Caption);
   sl:=TStringList.Create;
   try
     sl.Add('Es wurden '+s+' Waffeln produziert und verkauft.');
     sl.SaveToFile('C:\ProgramData\Waffelworker\Protokoll '+d+'\'+z+'.txt');
   finally
     sl.Free;
   end;
   end;
   CanClose := true;
end else
 CanClose := false;
end;
Button (Action):
Delphi-Quellcode:
procedure TFrmHaupt.ActBeendenExecute(Sender: TObject);
var
sl : TStringList;
s, d, z: String; mr: Integer; CanClose: Boolean;
begin
 mr := MessageDlg('Wirklich schließen???',mtConfirmation,[mbYes,mbNo],0);
   if mr = mrYes {mrNo} then begin
   if LblGesammt.Caption = '0' then begin
   MessageDlg('Es konnte kein Gesammt Protokoll angelegt werden, da keine Waffeln gebucht worden sind.', mtWarning, [mbOK], 0);
   CanClose := true;
   end else begin
   d := DateToStr(date);
   z := System.SysUtils.FormatDateTime('"Gesammt Protokoll " hh-nn-ss  dd, mm, yyyy' , (Now));
   s := (LblGesammt.Caption);
   sl:=TStringList.Create;
   try
     sl.Add('Es wurden '+s+' Waffeln produziert und verkauft.');
     sl.SaveToFile('C:\ProgramData\Waffelworker\Protokoll '+d+'\'+z+'.txt');
   finally
     sl.Free;
   end;
   end;
   Close;
end else
 CanClose := false;
end;
Es ist beides fast identisch aber es geht nicht..

Perlsau 2. Dez 2013 17:25

AW: CanClose
 
In dein Beenden-Button-Ereignis schreibst du einfach rein: Close;

In deinem OnCloseQuery-Ereignis, das beim Versuch, ein Formular zu schließen, ausgelöst wird, schreibst du rein, unter welchen Bedingungen das Formular geschlossen werden darf, z.B.:

Delphi-Quellcode:
procedure TFrmHaupt.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := Dialogs.MessageDlg('Wirklich schließen???',mtConfirmation,[mbYes,mbNo],0) = mrYes;
end;
Im Übrigen stellt der Hinweis "es geht nicht" keine Fehlermeldung dar und läßt auch keine Schlüsse zu, was denn genau nicht geht. Aber das hat man dir gefühlt schon hundert Mal erklärt, doch du weigerst dich weiterhin, ordentliche Fehlerbeschreibungen zu formulieren. Was ist denn daran so schwer zu begreifen???

Zu guter Letzt möchte ich noch darauf hinweisen, daß die Boolean-Variable CanClose eine lokale Variable von CloseQuery ist und im Close-Ereignis keinen Sinn macht.

Luki206 2. Dez 2013 17:30

AW: CanClose
 
Ich habe jetzt das einmal so gemacht wie du es gesagt hast, nur zeigt er mir zwei mal die Überprüfung ob das Fenster geschlossen werden sollte. Wie so kommt das jetzt so zu Stande und wie kann ich es machen damit es wirklich nur einmal erscheint?

Edit: wenn ich eine Fehlermeldung bekommen würde, hätte ich das schon erwähnt nur die Software läuft ja und nur an dieser Stelle macht er mir dann nichts wenn ich den Button drücke bzw. es wird nur die Message Box angezeigt

Perlsau 2. Dez 2013 17:39

AW: CanClose
 
Dein Programm macht genau das, was du programmierst: Wenn du in deinem ButtonClick-Ereignis und in CanClose die Abfrage machst, ob das Programm geschlossen werden soll, dann erscheint die Abfrage auch zweimal. Das heißt, du hast es eben nicht so gemacht, wie von mir vorgeschlagen: Im Button-Ereignis steht nur: Close; drin. Alles andere regelst du in OnCloseQuery. Am besten du machst dir eine private Procedure, wo du alles reinschreibst, was beim Programmende ausgeführt werden soll. Drückt der Anwender dann Yes bei der Abfrage in CloseQuery, ob wirklich beendet werden soll, rufst du diese Procedure auf und setzt danach CanClose (in CloseQuery) auf True. Drückt der Anwender No, wird nichts ausgeführt, CanClose wird nicht auf True gesetzt und dein Programm läuft weiter.

Was genau verstehst du denn jetzt daran nicht?

Code gibt's diesmal keinen.

Eine Fehlerbeschreibung muß nicht zwingend eine Compilermeldung sein, sondern kann, wie von dir eben formuliert, auch eine Beschreibung des unerwünschten Verhaltens sein. Dagegen sagt "geht nicht" überhaupt nichts aus und ermöglicht auch keine Hilfestellung, ohne dir wieder alles aus der Nase ziehen zu müssen.

Luki206 2. Dez 2013 17:46

AW: CanClose
 
Jetzt geht es. ButtonClick = nur Close.
Danke.

Der schöne Günther 2. Dez 2013 17:51

AW: CanClose
 
Als weiteren Vorschlag würde ich die Prüfung mit dem "Großer Gott, WIRKLICH SCHLIEßEN !?!?!"-Dialog und dem Abschlussdialog ("Es wurden X Crêpes verkauft") in eigene Methoden auslagern, so dass es ungefähr so aussieht:

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
begin
   self.Close();
end;

procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   ZeigeAbschlussDialog();
end;

procedure TForm4.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   if UserIstSichWirklichSicher() then
      CanClose := True
   else
      CanClose := False
   ;
end;

Perlsau 2. Dez 2013 18:07

AW: CanClose
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1238256)
in eigene Methoden auslagern, ...

Genau das hatte ich weiter oben bereits empfohlen. Aber unser Luki ist ja bereits zum nächsten Projekt gesprungen, für das er gerne fertige Konzepte und Codezeilen hätte.

Der schöne Günther 2. Dez 2013 18:25

AW: CanClose
 
Stimmt, hatte ich überlesen :oops:

Vielleicht ist die nächste Gruppenumarmung auch wieder überfällig :sharkylinchen:


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