Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Application.Terminate in Vista (https://www.delphipraxis.net/91129-application-terminate-vista.html)

Luckie 30. Apr 2007 12:06

Re: Application.Terminate in Vista
 
Aber so viel ich weiß, werden dann keine DLLs mehr entladen. Allerdings bin ich mir da nicht ganz sicher.

CCRDude 30. Apr 2007 12:32

Re: Application.Terminate in Vista
 
Ich kenne das unter Vista hauptsächlich mit Indy 9: Indy 9 ist da ganz gemein und gibt eine critical section nicht frei (selbst wenn man die Units nur einbindet, aber nicht benutzt - muß wohl am initialization-Teil einer der Units liegen), hab deswegen alle Programme, die ich aus rausgebe, auf Synapse umgestellt. Eigene ähnliche Fehler sind natürlich genauso kritisch, daher ganz allgemein: FastMM4 benutzen und alle Memory Leaks beheben, wenn das Programm dann mal ohne Leaks beendet, dann klappts auch mit Vista ;)

Christian Seehase 30. Apr 2007 12:42

Re: Application.Terminate in Vista
 
Moin Peter,

Zitat:

Zitat von PeterPanino
Der Aufruf von Application.Terminate erfolgt im OnCreate-Event des Hauptformulars.

das klingt für mich so, als solltest Du Deine Programmstruktur mal überdenken.
Wenn irgendeine Prüfung an der genannten Stelle dazu führt, dass das Programm nicht weiterlaufen soll, solltest Du die Prüfung lieber in der Projektdatei vornehmen.

BTW:
Application.Terminate verwende ich auch ungern, da hier, u.A., OnCloseQuery/OnClose nicht aufgerufen werden.

Flocke 30. Apr 2007 13:35

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Christian Seehase
Zitat:

Zitat von PeterPanino
Der Aufruf von Application.Terminate erfolgt im OnCreate-Event des Hauptformulars.

das klingt für mich so, als solltest Du Deine Programmstruktur mal überdenken.

Da kann ich nur zustimmen. PostQuitMessage legt nämlich einfach eine Meldung in die Message-Queue, die vom Programm dann in der normalen Meldungsschleife abgeholt und verarbeitet wird (oder auch nicht: das "while GetMessage(...) do ..." bricht dann nämlich ab, da die Bedingung FALSE ist).

An diesen Punkt (Meldungsschleife) kommt die Anwendung aber normalerweise erst in Application.Run. Also werden alle automatisch erzeugten Formulare, Berichte und Datenmodule (alles was in der DPR-Datei vor dem Application.Run steht) zunächst noch erzeugt (laufen also durch das OnCreate), bevor dein Application.Terminate Wirkung zeigt.

PeterPanino 1. Mai 2007 12:34

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Flocke
... An diesen Punkt (Meldungsschleife) kommt die Anwendung aber normalerweise erst in Application.Run. Also werden alle automatisch erzeugten Formulare, Berichte und Datenmodule (alles was in der DPR-Datei vor dem Application.Run steht) zunächst noch erzeugt (laufen also durch das OnCreate), bevor dein Application.Terminate Wirkung zeigt.

Danke für diese genaue Schilderung, die mit dem von mir beobachteten Verhalten übereinstimmt. Ich verwende nun doch Halt vor Application.Initialize (natürlich mit Fehlermeldung) um beim Fehlen von für die Anwendung vitalen Elementen das Programm zu beenden.

PeterPanino 1. Mai 2007 12:37

Re: Application.Terminate in Vista
 
Zitat:

Zitat von Christian Seehase
Wenn irgendeine Prüfung an der genannten Stelle dazu führt, dass das Programm nicht weiterlaufen soll, solltest Du die Prüfung lieber in der Projektdatei vornehmen.

Ja, das mache ich jetzt, danke für den Hinweis.

Christian Seehase 1. Mai 2007 13:05

Re: Application.Terminate in Vista
 
Moin Peter,

Zitat:

Zitat von PeterPanino
Ich verwende nun doch Halt vor Application.Initialize (natürlich mit Fehlermeldung) um beim Fehlen von für die Anwendung vitalen Elementen das Programm zu beenden.

Auf das Halt kannst Du verzichten.

Delphi-Quellcode:
begin
  // Prüfung der Programmvoraussetzungen
  if Fehler then begin
    // Sprechende Meldung(en) ausgeben
  end else begin
    Application.Initialize;
    Application.CreateForm(....);
    Application.Run;
  end;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 Uhr.
Seite 2 von 2     12   

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