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

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconDhakiyah hat folgendes geschrieben Zum zitierten Posting springen:

Brauche ich jetzt noch das normale OnClose?



user profile iconDhakiyah hat folgendes geschrieben Zum zitierten Posting springen:
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?



user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:

@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

user profile iconDhakiyah hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconDhakiyah hat folgendes geschrieben Zum zitierten Posting springen:
Naja, greife auf ne große Datenbank zu.
Vielleicht liegt es daran.

Wird wohl so sein ;-)