Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Programm beenden
Dhakiyah - Do 01.10.09 13:53
Titel: Programm beenden
Hallo!
Habe ein Programm und möchte das es egal wie ich es beende, die Abfrage kommt ob ich es beenden will.
Also wenn ich rechts oben das x drücke oder übers Menü Beenden oder unten rechts der Button beenden drücke.
Wie mache ich das?
Habe im Moment beim Button:
Delphi-Quelltext
1: 2: 3:
| begin if Application.MessageBox('Soll das Programm beendet werden?','Programm beenden',MB_YESNO+MB_IconQuestion) =IDYES then Close; end; |
Und beim OnClose vom Hauptfenster:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure Tfrm_mdi_main.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:= caFree; Application.Terminate; end; |
Was mir auch aufgefallen ist, wenn es beendet, dann dauert es ca. 20sec bis es wirklich komplett zu ist... Ist das normal???
Xentar - Do 01.10.09 13:57
TForm.OnCloseQuery
Dhakiyah - Do 01.10.09 13:59
Und dann??? Bzw. wie genau mache ich das?
Gausi - Do 01.10.09 14:07
Bevor eine Anwendung geschlossen wird, wird das OnCloseQuery-Event ausgelöst. In dieses packst du deine Messagebox rein, und setzt dann den parameter canClose entsprechend.
Den Code, den du jetzt im OnClose drin hast, würde ich einfach weglassen - oder ist das Fenster, das da grade geschlossen wird, nicht die Hauptform?
thepaine91 - Do 01.10.09 14:10
Es gibt Tform.canclose true/false bei false wird der Close Befehl einfach geschluckt.
Dafür im Objektinspektor bei deinem Formular um das es geht auf Ereignisse OnCloseQuerry.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if schließen then CanClose := true else CanClose := false; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if Schliesen then Action := caFree else Action := caNone; end; |
Bevorzugt CloseQuery und wen du Action caFree machst dürfte das Application.Terminate unnötig sein.
Hab aber lange nicht mehr mit gearbeitet.
Dhakiyah - Do 01.10.09 14:11
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure Tfrm_mdi_main.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Application.MessageBox('Soll das Programm beendet werden?','Programm beenden',MB_YESNO+MB_IconQuestion) =IDYES then CanClose := true; end; |
Habe ich jetzt gemacht. Wie verweise ich jetzt im Butten auf die CloseQuery???
Delphi-Quelltext
1: 2: 3: 4:
| procedure Tfrm_mdi_main.cmd_beendenClick(Sender: TObject); begin FormCloseQuery(); end; |
Geht nicht.
Ja, das ist die Hauptform.
thepaine91 - Do 01.10.09 14:12
mit TForm.close; ? ^^
Gausi - Do 01.10.09 14:12
Du musst auch noch else canclose := False setzen. ;-)
Und in dem Button packst du einfach ein close; rein - das sollte dann reichen. :D
Dhakiyah - Do 01.10.09 14:16
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure Tfrm_mdi_main.cmd_beendenClick(Sender: TObject); begin Close; end;
procedure Tfrm_mdi_main.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if Application.MessageBox('Soll das Programm beendet werden?','Programm beenden',MB_YESNO+MB_IconQuestion) =IDYES then CanClose := true else CanClose := false; end;
procedure Tfrm_mdi_main.mnu_beendenClick(Sender: TObject); begin Close; end; |
Klappt :lol:
Brauche ich jetzt noch das normale OnClose?
Und woran kann das liegen, dass er nach beenden noch 10-20sec braucht, bis er wirklich komplett zu ist? Er springt immer ins Programm aber man kann halt noch auf Programm abbrechen drücken...
Andreas L. - Do 01.10.09 14:17
Gausi hat folgendes geschrieben : |
Du musst auch noch else canclose := False setzen. ;-)
|
Besser gleich so:
Delphi-Quelltext
1: 2: 3: 4:
| procedure Tfrm_mdi_main.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := Application.MessageBox('Soll das Programm beendet werden?', 'Programm beenden', MB_YESNO + MB_IconQuestion) = IDYES; end; |
Gausi - Do 01.10.09 14:19
Ne, das OnClose würde ich in der Form dann weglassen. Kann sogar sein, dass das die Ursache ist - beim schließen sich selbst schließen ist irgendwie doppelt gemoppelt und rekursiv...
@Andreas L.: Klar, aber meins war für mich weniger Schreibarbeit. :mrgreen:
Andreas L. - Do 01.10.09 14:20
Dhakiyah hat folgendes geschrieben : |
Brauche ich jetzt noch das normale OnClose? |
Nö
Dhakiyah hat folgendes geschrieben : |
Und woran kann das liegen, dass er nach beenden noch 10-20sec braucht, bis er wirklich komplett zu ist? Er springt immer ins Programm aber man kann halt noch auf Programm abbrechen drücken... |
Hatte das mal bei einer ListView mit 25000 Einträgen, da hat das Programm auch ein bisschen gebraucht bis es zu war. Vielleicht hast du was derartiges?
Gausi hat folgendes geschrieben : |
@Andreas L.: Klar, aber meins war für mich weniger Schreibarbeit. :mrgreen: |
:mrgreen:
Dhakiyah - Do 01.10.09 14:22
Also das Programm geht komplett zu. Nur bin ich dann in der IDE und muss 10-20 sec. warten bis ich weiter machen kann, außer ich drücke halt auf Programm beenden.
Naja, greife auf ne große Datenbank zu.
Vielleicht liegt es daran.
LG
Andreas L. - Do 01.10.09 14:23
Dhakiyah hat folgendes geschrieben : |
Also das Programm geht komplett zu. Nur bin ich dann in der IDE und muss 10-20 sec. warten bis ich weiter machen kann, außer ich drücke halt auf Programm beenden. |
Genau so ist es bei mir auch.
Dhakiyah hat folgendes geschrieben : |
Naja, greife auf ne große Datenbank zu.
Vielleicht liegt es daran.
|
Wird wohl so sein ;-)
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!