Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programmabbruch mit Speicherbereinigung (https://www.delphipraxis.net/1443-programmabbruch-mit-speicherbereinigung.html)

hacki 26. Nov 2002 21:47


Programmabbruch mit Speicherbereinigung
 
Hallo,

kann mir jemand sagen, wie man im laufenden Betrieb "sauber" ein Programm beendet ? In meinem Fall möchte ich im laufenden Betrieb eine Strukturanpassung der Datenbank vornehmen, schlägt dies fehl (exception), so möchte ich das Programm beenden. Dazu habe ich folgendes versucht:

Code:
MainForm.Free;    // ?????
exit;
Das Prog wird dadurch auch beendet, aber es kommen einige Fehlermeldungen:
  • Zugriffsverletzung bei Adresse ....
  • Die Ausnahme "unknown software exception" ...

Wie kann man es eleganter machen ?

Gruß
Hacki

RomanK 26. Nov 2002 21:53

mit:
Delphi-Quellcode:
close;
:roll: :?:

Daniel B 26. Nov 2002 22:05

Hi,

mit
Delphi-Quellcode:
Close;
, schliesst Du nur Dein Programm, mit
Delphi-Quellcode:
Application.Terminate;
, kannst Du es richtig aus dem Speicher rausschmeissen. Also "richtig" Beenden.

Grüsse, Daniel :hi:

danielA 26. Nov 2002 22:08

Hallo Hacki,

also ich glaube dein Programm wird durch diesen Quelltext nicht beendet, eher durch die Fehlermeldung. :wink: Das Form ist nicht das Programm sondern nur ein Bestandteil des Projektes. Die Fehlermeldungen rühren wahrscheinlich daher, daß noch einige Variablen auf Speicherbereiche Zeigen, welcher nicht mehr allociert ist also Zeiger die ins Nirvana zeigen. Greift nun das noch laufende Programm darauf zu, gibts ne Exception und das Programm wird Terminated. Wobei wir beim Stichwort währen. Versuch mal dein Programm mit
Delphi-Quellcode:
Application.Terminate
zu beenden. Zu Application kann man das Programm sagen :chat:.
Solltest du mit Verketteten Listen arbeiten, müssen die jedoch vorher freigegeben werden, das machst du am Besten im OnClose Ereignis deines Forms. OBjekte werden so weit ich weiß automatisch beim schließen Freigegeben. Mach ich aber immer mit der Try ... Finally Klausel.
Alternative kannst du natürlich auch mit Mainform.Close aus dem MainForm das Programm beenden.

Gruß danielA

Motzi 27. Nov 2002 10:53

Zitat:

Zitat von Daniel B
Hi,

mit
Delphi-Quellcode:
Close;
, schliesst Du nur Dein Programm, mit
Delphi-Quellcode:
Application.Terminate;
, kannst Du es richtig aus dem Speicher rausschmeissen. Also "richtig" Beenden.

Grüsse, Daniel :hi:

Das is nicht ganz richtig... wenn die Close-Methode der MainForm aufgerufen wird, dann wird (nach einigen Aufräumarbeiten) ebenfalls Application.Terminate aufgrufen. Der Unterschied zwischen Close und Application.Terminate ist der, dass bei einem Aufruf von Application.Terminate keine OnClose Ereignisse mehr aufgerufen werden (ich bin es inzwischen leid immer genau zu erklären warum - einfach mal suchen, ich glaub ich hab das hier eh schonmal ausführlich beschrieben). Jedenfalls sollte man den Aufruf von Application.MainForm.Close immer dem Aufruf von Application.Terminate vorziehen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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