Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie beendet man ein Programm richtig??? (https://www.delphipraxis.net/4023-wie-beendet-man-ein-programm-richtig.html)

flomei 11. Apr 2003 15:44


Wie beendet man ein Programm richtig???
 
Bisher beende ich meine Programme immer mit
Delphi-Quellcode:
Application.Terminate
Gibt es ne bessere Möglichkeit oder ist das die Beste?


MfG Florian :hi:

*endlich-Osterferien-hab-und-deshalb-ganz-doll-freu* :bouncing4: :hello: :spin: :chat:

Flo 11. Apr 2003 16:13

Hi,
ich mach es eigentlich immer mit

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if MessageDlg('Soll das Programm wirklich beendet werden?',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    Close;
  end;
end;
Man kann da noch ne Position reinbauen. Dann siehts so aus:
Delphi-Quellcode:
var
   mtS: TMsgDlgType;
begin
if MessageDlgps('Soll das Programm wirklich beendet werden?',
    mtS, [mbYes, mbNo], (*position angeben*) ) = mrYes then
  begin
    Close;
  end;
Kannste auch mit OnCloseQuery machen. Ist schöner, weil wenn man auf das X klickt, kommt ebenfalls die Abfrage.

woki 11. Apr 2003 16:23

Hi Florian,

application.terminate ist für eine ordnungsgemäße Beendigung des Programms der korrekte Weg.

Ein close auf die Hauptform, wie von Flo beschrieben, ruft intern auch application.terminate auf.

Schöne Ferien noch.

Gruß
Wolfgang

flomei 11. Apr 2003 16:24

Zitat:

Zitat von woki
Schöne Ferien noch.

Danke :!:

MfG Florian

Motzi 11. Apr 2003 16:38

Naja.. ein Close-Befehl der MainForm ruft auch Application.Terminate auf, soweit richtig, allerdings erst zu einem späterm Zeitpunkt... Application.Terminate ruft intern PostQuitMessage auf wodurch eine WM_QUIT Message in der Message-Queue abgelegt wird worauf das Prog beendet wird. Damit werden aber keine eventuellen OnClose-Ereignisse mehr ausgelöst... ich verwende daher statt Application.Terminate immer Application.MainForm.Close!

Christian Seehase 11. Apr 2003 22:33

Moin Motzi,

oder kurz gesagt:

Application.Terminate übergeht OnCloseQuery und OnClose, so dass darin enthaltene Abfragen keine Wirkung mehr haben.

woki 12. Apr 2003 10:32

hmm,

schon richtig

aber ein close auf das Hauptformular ruft auch nur onclosequery und onclose des hauptformulars auf, d.h. die entsprechenden Ereignisse von anderen Formularen werden wiederum übergangen, wenn es sich nicht um MDI Anwendungen handelt.

Natürlich ruft man terminate erst nach Abarbeitung aller Notwendigen Schritte auf, und es bleibt damit die allgemeine Methode zum Beenden der App, natürlich nur als letzter Schritt einer Methode, oder gar Klasse, die die Beendigung handelt.

Close handelt in onclosequery und onclose alles was nöig ist zum Schließen einer Form, in einfachen Fällen (meistens) kann man sicher das Beenden der App mit dem Schließen des hauptformulars automatisch erledigen lassen.

Grüsse
Wolfgang

Christian Seehase 12. Apr 2003 13:14

Moin Wolfgang,

i.d.R. wird man OnCloseQuery/OnClose benötigen um bedingte Aufräumarbeiten erledigen zu können, z.B. die Abfrage ob Änderungen gespeichert werden sollen.
Das ein Close des Hauptformulares nur das OnClose usw. des Hauptformulares anspricht ist logisch aber man kann diese Ereignisse ja bei jedem Formular im Projekt "mit Leben" füllen, und somit, in Abhängigkeit des Formulares, auf das Schliessen reagieren.

Unbedingte Initialsierungen/Aufräumarbeiten beim Programmende gehören ja eh' besser in OnCreate/OnDestroy (bzw. intialization/finalization)

woki 12. Apr 2003 14:09

Hallo Chris,

was ich sagen wollte:

Beendet man ein Programm mit Terminate, werden alle offenen Formen geschlosssen, ohne das (was auch immer), der Entwickler in onclose, oder onclosequery noch prüfen, erledigen etc wollte, abgearbeitet wird (z.B. das Abspeichern von Daten).

Verwendet man deshalb das close der Hauptform, um die Anwendung zu beenden, dann wird zwar onclose/onclosequery der Hauptform aufgerufen, aber alle anderen Formen werden wiederum geschlossen, ohne das deren onclose/onclosequery Ereignisse aufgerufen werden (Daten werden nicht gespeichert)(außer bei MDI).

Oder anders, Anwendung beenden durch Terminate schließt alle Formen, ohne Abarbeitung des Onclose/Onclosequery implementierten Codes irgendeiner offenen Form,
Anwendung beenden durch close der Hauptform schließt immer noch alle Formen, ohne Abarbeitung des Onclose/Onclosequery implementierten Codes irgendeiner offenen Form (Daten gehen immer noch verloren), außer eben die der Hauptform,



Und es gibt auchnoch weitere Argumente, weswegen man meiner Meinung nach, wenn man es ganz sauber machen will, in Onclosequery nur code implementieren sollte, der als Reaktion auf Userclick auf das Schließenicon der Form notwendig ist, ich die programmgesteuerte Beendigung eines komplexen Programms einer Methode überlassen würde, die mit application.terminate abschließt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz