Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Abfrage ob Pogramm geschlossen werden soll. (https://www.delphipraxis.net/122871-abfrage-ob-pogramm-geschlossen-werden-soll.html)

Sudrow 23. Okt 2008 14:31


Abfrage ob Pogramm geschlossen werden soll.
 
Hallo Leute, ich bin gerade leicht am verzweifeln.
Ich wollte bei meinem Programm eine Abfrage machen, wenn man das Programm schließen will, ob man sich sicher ist oder nicht.
Wenn man es nicht will sol ldas Programm nicht zugehen, ansonsten schon.

Ich habs mit dem Quellcode probiert
Delphi-Quellcode:
if MessageDlg('Programm schließen?', mtConfirmation, [mbyes, mbno], 0) = mrYes then
  close
Aber das will irgendwie nicht so ganz.

Wenn ich auf Nein klicke schließt sich das Programm, bei Ja kommt der Dialog erneut und so weiter.
Hoffe mir kann jemand helfen.

mfg Sudrow

HenKst 23. Okt 2008 14:34

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Diese Codezeile seht vermutlich im CloseQuerry?(wenn nicht sollte sie da hin :) )

Wenn du im CloseQuerry close aufrufst, kommst du da ja wieder an^^.

Du musst den var parameter "Canclose" vom querry auf true/false setzen

true wenns geschlossen werden soll, false wenn nicht.

Wenn du momentam bei deinem Dialog "nein" klickst schliesst sich dein Programm weil CanClose default mässig true ist.

Progman 23. Okt 2008 14:35

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Wo rufst du denn den MessageDlg auf? Nicht etwa in FormClose? ;)

Sudrow 23. Okt 2008 14:36

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Zitat:

Zitat von HenKst
Diese Codezeile seht vermutlich im CloseQuerry?

Wenn du im CloseQuerry close aufrufst, kommst du da ja wieder an^^.

Du musst den var parameter "Canclose" vom querry auf true/false setzen

true wenns geschlossen werden soll, false wenn nicht.

Leider wohl doch da aufgerufen xD

Delphi-Quellcode:
procedure THaupt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if MessageDlg('Programm schließen?', mtConfirmation, [mbyes, mbno], 0) = mrYes then
  close
end;
Nur wie setz ich das CanClose auf false, also wie ist der Befehl dafür?

Danke schonmal für die Antwort.

SirThornberry 23. Okt 2008 14:37

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Auch im FormClose hat so ein Dialog eine Chance zu funktionieren wenn man den Parameter Action manipuliert.
@Sudrow: Schau am besten mal in die Hilfe zu den Ereignissen OnClose und OnCloseQuery. Da werden sicher auch die Parameter erklärt.

HenKst 23. Okt 2008 14:38

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Das ist ja nicht OnCloseQuery sondern OnClose^^

Schau dir mal TForm.OnCloseQuery an

€dit
hab mal selber in die hilfe geschaut^^

wenn du im OnClose Action auf caFree setzt, wird dein form auch geclosed.

DeddyH 23. Okt 2008 14:39

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Zusammengefasst:
Delphi-Quellcode:
procedure TFormWuppdi.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   CanClose := MessageDlg('Programm schließen?', mtConfirmation, [mbyes, mbno], 0) = mrYes;
end;

SirThornberry 23. Okt 2008 14:40

Re: Abfrage ob Pogramm geschlossen werden soll.
 
oder eben:
Delphi-Quellcode:
procedure THaupt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if (MessageDlg('Programm schließen?', mtConfirmation, [mbyes, mbno], 0) <> mrYes) then
     Action := caNone;
end;

Progman 23. Okt 2008 14:41

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Versuchs mal im CloseQuery:

Delphi-Quellcode:
if MessageDlg('Programm schließen?', mtConfirmation, [mbyes, mbno], 0) = mrYes then
 CanClose := True else CanClose := False;

Sudrow 23. Okt 2008 14:45

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Wo Danke für die vielen und schnellen Antworten.
Ich hab mir jetzt eine der vielen rausgesucht und sie funktioniert.

Dankeschön ;)
Schönen Tag noch.
MFG Sudrow

Sven M. 23. Okt 2008 15:29

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Zitat:

Zitat von Progman
Versuchs mal im CloseQuery:

Delphi-Quellcode:
if MessageDlg('Programm schließen?', mtConfirmation, [mbyes, mbno], 0) = mrYes then
 CanClose := True else CanClose := False;


Habe auch im Moment ein paar Problemchen mit dem ordnungsgemäßen Schließen des Programms. Das Problem: Wenn ich es genau so mache wie oben, ist die Anwendung zwar weg, steht aber im Taskmanager noch drin. Hat jemand 'ne Ahnung, woran das liegt?


Besten Dank im Voraus,
Sven M.

DeddyH 23. Okt 2008 15:31

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Tritt das Phänomen auch dann auf, wenn Du oben zitierten Code auskommentierst?

Sven M. 23. Okt 2008 15:41

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Ja, auch dann!

Kann es eventuell daran liegen, dass das Fenster, aus dem ich das Programm beenden möchte, nicht das im Projektmanager eingestellte Hauptfenster ist?


Dann hätte ich das nächste Problem: Wie kann ich abfragen, von wo aus einer Procedure aufgerufen wird. Denn im OnCloseQuery des Hauptformulars müsste ich ja dann den Fall abfangen, dass ich das Programm beenden möchte oder nur das Fenster schließen will...Verwirrend...;)

SirThornberry 23. Okt 2008 15:42

Re: Abfrage ob Pogramm geschlossen werden soll.
 
@Seven: Das kommt in aller Regel vor wenn man mit Threads hantiert und da noch einer läuft oder man mit Application.Processmessages Nachrichten abarbeitet während man noch in einer Schleife hängt.

Sven M. 24. Okt 2008 07:52

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Hab's gefunden...=)

Lag tatsächlich daran, dass ich das Programm von einem anderen als dem Hauptfesnter (in den Projektoptionen) aus schließen wollte.
Hab's jetzt so gelöst, dass das eigentliche Hauptfenster (aus User-Sicht) auch das Hauptfenster in den Projektoptionen ist und das Fenster, das beim Start angezeigt werden soll (deswegen war's das Hauptfenster) über einen Timer geöffnet wird...:)

Micha88 24. Okt 2008 08:49

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Also ich persönlich mag den MessageDlg nicht so :gruebel:


Ich mache das immer so:

Delphi-Quellcode:
procedure THaupt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if (Application.MessageBox('Sind Sie sicher, dass Sie diese Anwendung schließen möchten?', 'Information', MB_IconInformation + MB_YesNo) = ID_Yes) then
  begin
   // ggf. alles freigeben, Bitmaps, SL's usw
   Self.Close; // ENDE!
  end;
end;

Sven M. 24. Okt 2008 09:10

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Hat das bestimmte Gründe?

DeddyH 24. Okt 2008 09:22

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Eine MessageBox wird von Windows gezeichnet, ein MessageDlg von Delphi.

Cicaro 21. Feb 2010 15:20

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Geht diese Abfrage auch modal ?

Edit: Schon gut, ist schon standardmäßig modal. Bei mir wird die Abfrage durch einen Timer mehrmals aufgerufen. Muss nur den Timer ausschaten, damit die Abfrage nicht nochmal erfolgt.

DeddyH 21. Feb 2010 15:28

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Die Windows.MessageBox zumindest geht auch modal MSDN-Library durchsuchenMessageBox.
Zitat:

To indicate the modality of the dialog box, specify one of the following values.

MB_APPLMODAL
The user must respond to the message box before continuing work in the window identified by the hWnd parameter. However, the user can move to the windows of other threads and work in those windows.

Depending on the hierarchy of windows in the application, the user may be able to move to other windows within the thread. All child windows of the parent of the message box are automatically disabled, but pop-up windows are not.

MB_APPLMODAL is the default if neither MB_SYSTEMMODAL nor MB_TASKMODAL is specified.
MB_SYSTEMMODAL
Same as MB_APPLMODAL except that the message box has the WS_EX_TOPMOST style. Use system-modal message boxes to notify the user of serious, potentially damaging errors that require immediate attention (for example, running out of memory). This flag has no effect on the user's ability to interact with windows other than those associated with hWnd.
MB_TASKMODAL
Same as MB_APPLMODAL except that all the top-level windows belonging to the current thread are disabled if the hWnd parameter is NULL. Use this flag when the calling application or library does not have a window handle available but still needs to prevent input to other windows in the calling thread without suspending other threads.

Luckie 21. Feb 2010 15:33

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Also, ich finde solche Dialoge immer absolut nervig. Eine Nachfrage bei drohendem Datenverlust ist OK, aber nicht, wenn ich das Programm nur schließen will. Wenn ich es versehentlich schließe, mache ich es eben wieder auf. Solche Abfragen hinterlassen bei mir immer einen faden Beigeschmack, als wenn der Entwickler der Meinung ist, er hätte das tollste Programm geschrieben und könnte nicht glauben, dass man es auch mal beenden möchte. Und das beste ist, solche Leute machen sich dann bei Windows darüber lustig, wenn Windows nachfragt, ob eine Aktion auch wirklich ausgeführt werden soll.

DeddyH 21. Feb 2010 15:56

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Bei MDI-Anwendungen können solche Abfragen aber wieder Sinn machen. Mir selbst ist es schon oft passiert, dass ich statt des Clientfensters das Hauptfenster geschlossen hätte, wenn unsere Software nicht nachfragen würde.

Sir Rufo 21. Feb 2010 16:01

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Zitat:

Zitat von DeddyH
Bei MDI-Anwendungen können solche Abfragen aber wieder Sinn machen. Mir selbst ist es schon oft passiert, dass ich statt des Clientfensters das Hauptfenster geschlossen hätte, wenn unsere Software nicht nachfragen würde.

Und selbst das kann elegant gelöst werden ...

sind in den MDI-Fenstern alle Daten gespeichert?
- Nein - Dann fragen wir lieber mal nach (speichern, nicht speichern, abbrechen)
- Ja - und tschüssikowski

DeddyH 21. Feb 2010 16:07

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Ich meinte: wenn ich das Clientfenster schließen will, erwische ich versehentlich schonmal das falsche "X" ;)

Sir Rufo 21. Feb 2010 16:13

Re: Abfrage ob Pogramm geschlossen werden soll.
 
Zitat:

Zitat von DeddyH
Ich meinte: wenn ich das Clientfenster schließen will, erwische ich versehentlich schonmal das falsche "X" ;)

Das war mir schon klar ;)

Eine weitere Möglichkeit, per Option das App-X zum Schließen zum Hide oder Minimize umfunktionieren.
Wer wirklich beenden will, kann auch Datei-Beenden anklicken.

Aber das ständige Nachfragen "Sind Sie im Vollbesitz ihrer geistigen Kräfte, habe Sie das 20-seitige Formblatt gelesen, mit Ihrer Mutter telefoniert ... und jetzt immer noch sicher, dass sie dieses SuperDuperProgramm schließen wollen?"

:mrgreen:

PS: Software FOR people - not against


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