![]() |
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:
Das ganze dient eher nur zum 'spielen und experimentieren' als das es wirklich in gebrauch genommen wird ;)
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; Danke Gruß Luki :) |
AW: CanClose
Warum nimmst du nich den CloseQuery-Event?
|
AW: CanClose
geht es damit besser?
Edit: Ok, mit CloseQuery geht es ;) |
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.. :?:
|
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.
|
AW: CanClose
OnCloseQuery:
Delphi-Quellcode:
Button (Action):
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;
Delphi-Quellcode:
Es ist beides fast identisch aber es geht nicht..
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; |
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:
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???
procedure TFrmHaupt.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := Dialogs.MessageDlg('Wirklich schließen???',mtConfirmation,[mbYes,mbNo],0) = mrYes; end; 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. |
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 |
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. |
AW: CanClose
Jetzt geht es. ButtonClick = nur Close.
Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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