AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie beendet man ein Programm richtig???

Ein Thema von flomei · begonnen am 11. Apr 2003 · letzter Beitrag vom 12. Apr 2003
Antwort Antwort
Benutzerbild von flomei
flomei

Registriert seit: 17. Jan 2003
Ort: Schieder-Schwalenberg
2.094 Beiträge
 
Delphi 2005 Personal
 
#1

Wie beendet man ein Programm richtig???

  Alt 11. Apr 2003, 16:44
Bisher beende ich meine Programme immer mit
Application.Terminate Gibt es ne bessere Möglichkeit oder ist das die Beste?


MfG Florian

*endlich-Osterferien-hab-und-deshalb-ganz-doll-freu*
Florian Meier
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
  Mit Zitat antworten Zitat
Benutzerbild von Flo
Flo

Registriert seit: 30. Mär 2003
Ort: Süd-Niedersachsen
81 Beiträge
 
Delphi 5 Professional
 
#2
  Alt 11. Apr 2003, 17: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.
MfG
Florian

SwapIt!:
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#3
  Alt 11. Apr 2003, 17: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
  Mit Zitat antworten Zitat
Benutzerbild von flomei
flomei

Registriert seit: 17. Jan 2003
Ort: Schieder-Schwalenberg
2.094 Beiträge
 
Delphi 2005 Personal
 
#4
  Alt 11. Apr 2003, 17:24
Zitat von woki:
Schöne Ferien noch.
Danke

MfG Florian
Florian Meier
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#5
  Alt 11. Apr 2003, 17: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!
Manuel Pöter
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 11. Apr 2003, 23:33
Moin Motzi,

oder kurz gesagt:

Application.Terminate übergeht OnCloseQuery und OnClose, so dass darin enthaltene Abfragen keine Wirkung mehr haben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#7
  Alt 12. Apr 2003, 11: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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 12. Apr 2003, 14: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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#9
  Alt 12. Apr 2003, 15: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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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