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; 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
Narses: 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
Xentar 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
Narses hat folgendes geschrieben : |
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!
Tastaro hat folgendes geschrieben : |
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 CanClose := True; end; |
Narses - Mi 16.12.09 18:25
Moin!
Airtrox hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
Und um das noch einmal deutlich zu betonen:
Wenn man das tatsächlich statt im von Xentar 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!