![]() |
Wie beendet man ein Programm richtig???
Bisher beende ich meine Programme immer mit
Delphi-Quellcode:
Gibt es ne bessere Möglichkeit oder ist das die Beste?
Application.Terminate
MfG Florian :hi: *endlich-Osterferien-hab-und-deshalb-ganz-doll-freu* :bouncing4: :hello: :spin: :chat: |
Hi,
ich mach es eigentlich immer mit
Delphi-Quellcode:
Man kann da noch ne Position reinbauen. Dann siehts so aus:
procedure TForm1.Button1Click(Sender: TObject);
begin if MessageDlg('Soll das Programm wirklich beendet werden?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin Close; end; end;
Delphi-Quellcode:
Kannste auch mit OnCloseQuery machen. Ist schöner, weil wenn man auf das X klickt, kommt ebenfalls die Abfrage.
var
mtS: TMsgDlgType; begin if MessageDlgps('Soll das Programm wirklich beendet werden?', mtS, [mbYes, mbNo], (*position angeben*) ) = mrYes then begin Close; end; |
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 |
Zitat:
MfG Florian |
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!
|
Moin Motzi,
oder kurz gesagt: Application.Terminate übergeht OnCloseQuery und OnClose, so dass darin enthaltene Abfragen keine Wirkung mehr haben. |
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 |
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) |
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 08:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz