Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - OnClose Abbrechen


Airtrox - Mi 16.12.09 00:06
Titel: OnClose Abbrechen
Abend,

ich will beim Schließen eines Formulars eine Abfrage starten, ob wirklich geschlossen werden soll. Nun, klappt es leider nicht ganz so wie ich will:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
     var
    AMsgDialog: TForm;
begin
AMsgDialog := CreateMessageDialog('Wirklich beenden?', mtWarning, [mbYes, mbNo]);
 with AMsgDialog do
    try
       Caption := 'Metropolis';

          case ShowModal of
             ID_YES: application.Terminate;
             ID_NO: action:=caNone;      // hier hackts
          end;

    finally
    free;
 end;

Habe ein wenig gegooglet und leider keine Lösung gefunden, die passen könnte. Das Problem liegt beim "Nicht-Schließen" falls Nein gedrückt wurde...


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 15.12.2009 um 23:15


Narses - Mi 16.12.09 00:16

Moin!

Probier das mal so: :idea:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if MessageDlg('Wirklich beenden?',mtConfirmation,mbOKCancel,0) <> mrOK then
    Action := caNone;
cu
Narses


Xentar - Mi 16.12.09 00:36

Schließen.. Abfrage..
Da gibt es doch sogar ein gleichnamiges Event: OnCloseQuery.


Airtrox - Mi 16.12.09 00:37

edit: Super, klappt so :)


jaenicke - Mi 16.12.09 02:52

Und um das noch einmal deutlich zu betonen:
Wenn man das tatsächlich statt im von user profile iconXentar erwähnten OnCloseQuery in OnClose macht, dann handelt man sich Probleme mit Windows ein, da das so nicht vorgesehen ist.

Windows fragt z.B. beim Herunterfahren zuerst an, ob das so in Ordnung ist. Genau dafür dient OnCloseQuery auch. Wenn man jetzt dort vorspiegelt, dass alles ok sei, dann aber das Beenden in OnClose doch abbricht, dann treten genau die nervigen Effekte auf, die manchmal beim Herunterfahren auftreten:
Irgendein Programm hängt, trotzdem kann man nicht einmal mehr den Taskmanager oder ein anderes Programm öffnen, da ja Windows schon denkt, es könne herunterfahren usw.

Deshalb: Das Abbrechen des Schließens sollte ausschließlich in OnCloseQuery passieren...


Tastaro - Mi 16.12.09 10:16

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

Probier das mal so: :idea:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if MessageDlg('Wirklich beenden?',mtConfirmation,mbOKCancel,0) <> mrOK then
    Action := caNone;
cu
Narses


Es gibt Softwareentwickler, die wegen geringerem Unfug erschossen wurden, Narses. :D

OnCloseQuery ist ja wohl die einzig richtige Lösung des Problems.

Beste Grüße


Narses - Mi 16.12.09 10:36

Moin!

user profile iconTastaro hat folgendes geschrieben Zum zitierten Posting springen:
Es gibt Softwareentwickler, die wegen geringerem Unfug erschossen wurden, Narses. :D

OnCloseQuery ist ja wohl die einzig richtige Lösung des Problems.
Steht da irgendwo, dass ich diese Lösung empfehle? :gruebel: Kennt ihr den exakten Anwendungszweck dieses Ansatzes? :nixweiss: Ich habe auf die Frage geantwortet, mehr nicht. ;)

cu
Narses


Airtrox - Mi 16.12.09 15:17

Heißt das im Klartext, dass ich die von mir geanannten Source bei OnCloseQuery einfügen soll ( klappt nicht, Fehler an der selben Stelle) oder die von Narses bei OnCloseQuery?
Wie wäre denn meine Variante richtig formuliert, denn sie ist mir lieber, damit kann man den Fenstertext noch definieren :)


elundril - Mi 16.12.09 15:33

probiermal


Delphi-Quelltext
1:
2:
3:
if MessageDlg('Wollen sie echt wirklich jetzt in diesem moment und keine anderen auf jeden fall auf der stelle mein Programm beenden?', mtConfirmation, [mbYes,mbNo],0) = mrYes then
  CanClose := True
else CanClose := False;


und das bitte ins CloseQuery.

Erklärung: die Variable/den Parameter Action gibt es im CloseQuery nicht ;)

lg elundril


DonManfred - Mi 16.12.09 15:33


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure Tfrmppday.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  // Mach deine Prüfungen....
  // ... und dann setze
  CanClose := True; // oder false, je nach Bedarf ob das Fenster geschlossen werden darf oder nicht...
end;


Narses - Mi 16.12.09 18:25

Moin!

user profile iconAirtrox hat folgendes geschrieben Zum zitierten Posting springen:
denn sie ist mir lieber, damit kann man den Fenstertext noch definieren :)
Den Fenstertitel für Dialoge/Messageboxen kannst du doch global in den Projekteigenschaften einstellen, das würde ich eh nicht so machen. :idea: ;)

cu
Narses


Dude566 - Mi 16.12.09 19:46

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und um das noch einmal deutlich zu betonen:
Wenn man das tatsächlich statt im von user profile iconXentar erwähnten OnCloseQuery in OnClose macht, dann handelt man sich Probleme mit Windows ein, da das so nicht vorgesehen ist.

Windows fragt z.B. beim Herunterfahren zuerst an, ob das so in Ordnung ist. Genau dafür dient OnCloseQuery auch. Wenn man jetzt dort vorspiegelt, dass alles ok sei, dann aber das Beenden in OnClose doch abbricht, dann treten genau die nervigen Effekte auf, die manchmal beim Herunterfahren auftreten:
Irgendein Programm hängt, trotzdem kann man nicht einmal mehr den Taskmanager oder ein anderes Programm öffnen, da ja Windows schon denkt, es könne herunterfahren usw.

Deshalb: Das Abbrechen des Schließens sollte ausschließlich in OnCloseQuery passieren...


Das ist ja mal interessant, wieder was dazu gelernt, habe sonst auch eine Abfrage ins normale OnClose gemacht.