Zitat von
Borti:
Tut mir leid MaBuSE,
Die Form1 existiert trotzdem im Hintergrund weiter. Man kann sie zwar nicht sehen, durch Form1.Hide, aber wenn man diese Zeile weglässt bleibt die Form inaktiv im Hintergrund. Ich muss den Speicher für Form1 aber unbedingt freigeben bevor Form2 angezeigt wird.
Gruß,
Borti
In diesem Fall mußt Du (wie Du ja selbst schon erkannt hast) ein Application.Terminate aufrufen.
Wenn Du das Form1 mit Form1.Realease freigegeben hast, kannst Du natürlich kein Form1.Close mehr ausführen, da Form1 ja nicht mehr existiert
Aber Application.Terminate ist der sichere Weg.
Auf Application.MainForm kann leider nur lesend zugegriffen werden, sonst wäre ja folgendes möglich:
Application.MainForm := Form2; Form2.Show; Form1.Close;
Aber das geht ja nicht :-/
Bleiben also nur noch 3 Möglichkeiten übrig:
1. Eine eigene TmyApplication erzeugen:
In der
Unit Forms ist TApplication definiert. Du könntest Dir eine eigene myForms schreiben, in der Du TmyApplication von TApplication ableitest.
In der TApplication.Run müsstest Du dann folgende Schleife um Deine Überprüfung ob alle Forms freigegeben sind ergänzen
Delphi-Quellcode:
procedure TApplication.Run;
begin
FRunning := True;
try
...
repeat
try
HandleMessage;
except
HandleException(Self);
-> If KeineFormsMehrDa then Application.Terminate;
end;
until Terminated;
end;
finally
FRunning := False;
end;
end;
Das ist aber nicht ganz so einfach... Viel Spaß
2. Die Forms.pas von Delphi abändern
Tu Dir einen Gefallen und mach das nicht.
Falls doch, siehe 1.
3. Class Helper benutzen
In Delphi 8 (nur .net) und hoffentlich auch in Delphi 9 (auch
win32) gibt es die sogenannten ClassHelper
Damit könnte man die Klasse TApplication von außen um diese Funktionalität ergänzen.
Andere Möglichkeiten sehe ich im Moment nicht.