Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Application.Terminate wird einfach ignoriert !! ??? (https://www.delphipraxis.net/96817-application-terminate-wird-einfach-ignoriert.html)

Uwe.F. 31. Jul 2007 11:10


Application.Terminate wird einfach ignoriert !! ???
 
Hallo Zusammen,

Application.Terminate heisst doch eigentlich, dass die Applikation beendet wird.
Bei mir nicht :wall:

Nach Application.Terminate hagelt es bei mir Schutzverletzungen :gruebel:

Ich habe es erst beim Debuggen gefunden: D7 Enterprise geht einfach über Application.Terminate hinweg ...

http://home.arcor.de/datenquelle/Terminate.jpg

Hat da einer eine Idee?

Beste Grüße,
Uwe F

chrisw 31. Jul 2007 11:14

Re: Application.Terminate wird einfach ignoriert !! ???
 
Application.Terminate ruft nur PostQuitMessage() auf, d.h. es erfolgt keine sofortige Beendigung des Programms, sondern es wird nur ein WM_QUIT in die MessageQueue gelegt.

borncrush 31. Jul 2007 11:19

Re: Application.Terminate wird einfach ignoriert !! ???
 
Hi,

zwar frage ich mich wieso du nach deinem application.terminate noch Code ausführen möchtest...
aber das sei jetzt erstmal dahin gestellt.

Würde es etwas bringen, wenn du nach Terminate noch ProcessMessages aufrufst??

Delphi-Quellcode:
Application.Terminate; //App beenden
Application.ProcessMessages; //um das Quit-Signal zuverarbeiten
Leider bin ich mich nicht sicher

MfG
Dave

Uwe.F. 31. Jul 2007 11:28

Re: Application.Terminate wird einfach ignoriert !! ???
 
Ja, in gewissen Fehlerfällen will ich vorzeitig das Programm beenden.
Der dargestellte "Schnipsel" war nur ein Beispiel zur Demonstration.

Das mit dem Processmessages werde ich mal testen.

Beste Grüße,
Uwe

FAlter 31. Jul 2007 11:49

Re: Application.Terminate wird einfach ignoriert !! ???
 
Hi,

Sämtlicher Code nach Apoplicaton.Terminate wird augfgerufen, bis das Programm im Leerlauf ist... Wenn du also eventuell noch irgendwo eine Schleife abarbeitest, musst du das z. B. so machen:

Delphi-Quellcode:
repeat
  ...
until (a < b) or Application.Terminated;
Ansonsten mache ich es immer so:

Delphi-Quellcode:
if c < 0 then
begin
  ...
  Application.Terminate;
  exit;
end;
Damit auch die aktuelle procedure (oder function) verlassen wird.

Mfg
FAlter

Christian Seehase 31. Jul 2007 11:57

Re: Application.Terminate wird einfach ignoriert !! ???
 
Moin Uwe,

Du solltest übrigens, ggf., auch daran denken, dass bei Application.Terminate die OnCloseQuery- und OnClose-Ereignisse nicht ausgeführt werden.

Uwe.F. 31. Jul 2007 12:12

Re: Application.Terminate wird einfach ignoriert !! ???
 
Zitat:

Zitat von Christian Seehase
... dass bei Application.Terminate die OnCloseQuery- und OnClose-Ereignisse nicht ausgeführt werden.

Jau - das könnte die Lösung für meine Schutzverletzungen nach Terminate sein. Insbesondere die für mich nicht sichtbaren OnClose wie z.B. in Komponenten deren Quelltext ich nicht habe ...

Ein Beispiel ist die Einbindung von ADO. Nach Terminate kommem jede Menge Schutzverletzungen (obwohl ADO nur eingebunden ist und nicht benutzt wurde). Kommentiere ich alle ADO-Zugriffe nebst Einbindung in USES aus, geht alles.

Gibt's denn so etwas wie einen kontrollierten Ausstieg mit allen OnCloseQuery- und OnClose-Ereignisse? Bisher sah ich Terminate als solchen an ...

Beste Grüße,
Uwe

Christian Seehase 31. Jul 2007 12:39

Re: Application.Terminate wird einfach ignoriert !! ???
 
Moin Uwe,

Close im Hauptformular schliesst die Anwendung.
Zu Schutzverletzungen dürfte es aber auch bei Application.Terminate nicht kommen, denn OnDestroy wird aufgerufen.
Das Hauptproblem dürfte, wie schon mehrfach gesagt, einfach sein, dass nach dem Terminate noch Code ausgeführt wird, was Du durch eine andere Strukturierung vermeiden könntest.

Uwe.F. 31. Jul 2007 15:24

Re: Application.Terminate wird einfach ignoriert !! ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Kollegen,

es muss wohl an ADO liegen; folgende minimalistische Konstruktion erzeugt den erwähnten Fehler:

Code:
program Project1;
uses Forms, Unit1 in 'Unit1.pas';
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  If not True then Application.Run;
end.
Code:
unit Unit1;
interface
uses Windows, Forms, DB, ADODB, Classes;
type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOTable1: TADOTable;
  private
  public
  end;
var Form1: TForm1;
implementation
end.
Fehlermeldung: sieh Anhang.

Vermutlich muss ich die ADO "irgendwie" stoppen ... hat jemand eine Idee, wie :gruebel:

Gruss,
Uwe


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 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 by Thomas Breitkreuz