Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm beenden und Speicher freigeben? (https://www.delphipraxis.net/57983-programm-beenden-und-speicher-freigeben.html)

sebl2002 29. Nov 2005 16:49


Programm beenden und Speicher freigeben?
 
Hallo Welt,

ich arbeite gerade an einem Bildschirmschoner, bei dem -unter anderem- über einen Timer JPEGs geladen werden. Mausbewegungen und Tastatureingaben fange ich über Application.OnMessage ab, die ich in FormActivate in eine eigene Prozedur umleite. Bei einem Maus- oder Tastaturevent beende ich die Anwendung mit Application.Mainform.Close. In FormClose wird der reservierte Speicher wieder freigegeben.

Wenn ein solches Event zum Zeitpunkt der Speicherzuweisung oder dem Laden des JPEGs auftritt, bekomme ich eine EAccessViolation. Sofern ich das Programm mit Application.Terminate schließe, kommt dieser Fehler nicht, dafür wird mein Arbeitsspeicher immer ein bisschen weniger.

Wie kann ich es vermeiden, dass das Programm geschlossen wird, wenn der Timer aktiv geworden ist? Hat jemand eine elegante Idee dazu?

Vielen Dank für eure Hilfe!

Palando 29. Nov 2005 16:53

Re: Programm beenden und Speicher freigeben?
 
Herzlich Willkommen in der DP! :dp:


Du könntest jedes mal, wenn ein Timer aktiv wird, die Form.OnCloseQuery auf eine Funktion umleiten die das schließen verbietet und ggf. speichert, dass geschlossen werden sollm, wenn der Timer fertig ist. Am Ende des Timer wird das OnCloseQuery wieder auf die eigentliche Funktion umgeleitet.

Das geht sicher aber besser. Gibts vielleicht ne Form.CanClose property?

shmia 29. Nov 2005 17:22

Re: Programm beenden und Speicher freigeben?
 
Zitat:

Zitat von sebl2002
Bei einem Maus- oder Tastaturevent beende ich die Anwendung mit Application.Mainform.Close.

Damit ziehst du dir evtl. dein Programm unterm A.... weg. :-)
Statt dessen versuche mal Application.Terminate.
So wird das Formular nicht sofort geschlossen, sondern es wird eine Windows-Message WM_QUIT verschickt.
Dein Programm läuft weiter, bis es wieder Messages verarbeiten kann.
Nun gibt es folgenden Nachteil:
es wird der gesamte Initialisierungcode ausgeführt und dann erst beeendet.
Um dies zu beschleunigen ist folgendes zu tun:
Delphi-Quellcode:
procedure TForm1.Timer1OnTimer(Sender: ...);
begin
   if Application.Terminated then
      Exit;
   Image1.LoadFromFile(....);
end;

sebl2002 30. Nov 2005 07:30

Re: Programm beenden und Speicher freigeben?
 
Zitat:

Statt dessen versuche mal Application.Terminate.
Das hatte ich ja vorher schon probiert - allerdings hatte ich die Befehle zum Speicher freiräumen in FormOnClose stehen, so dass diese nicht ausgeführt wurden.

Jetzt setze ich Application.Terminate ein und räume den Speicher in FormDestroy frei. Das funzt.

Danke für die Tipps!


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