Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


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