Zitat von
Borti:
Hallo!
ich hab grad das problem, dass sich mein Programm nichgt beendet. Mit dem folgendem Code gebe ich erstmal den speicher für meine Form1 frei und zeige gleich anschließend meine Form2 an.
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Release;
Form2.ShowModal;
end;
Wenn ich jedoch dann Form2.close aufrufe schließt sich zwar auch meine 2.Form, aber die application läuft für den Benutzer unsichtbar weiter. Erst mit application.terminate beendet sich auch die gesammte Anwendung. Aber warum?
Mit Release können Sie das Formular aus dem Speicher entfernen.
Release gibt das Formular erst frei, nachdem die Ausführung der Ereignisbehandlungsroutinen des Formulars und seiner untergeordneten Komponenten beendet ist. Die Methode stellt auch sicher, daß alle Botschaften in der Ereigniswarteschlange des Formulars vor dessen Freigabe bearbeitet werden. Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.
Hinweis: Release gibt die Steuerung sofort an die aufrufende Routine zurück und wartet nicht, bis das Formular freigegeben wird.
Also Release entfernt "nur" das Formular.
Das wird auch klar wenn man sich den Quelltext der
VCL anschaut.
Delphi-Quellcode:
...
TCustomForm =
class(TScrollingWinControl)
private
...
procedure CMRelease(
var Message: TMessage);
message CM_RELEASE;
...
public
...
procedure Release;
...
end;
...
procedure TCustomForm.CMRelease;
begin
Free;
end;
...
procedure TCustomForm.Release;
begin
PostMessage(
Handle, CM_RELEASE, 0, 0);
end;
...
Wenn Du ein Formular schliessen willst, dann nimm Form1.Close;
Beschreibung
Mit Close können Sie ein Formular schließen.
Versuche, ein Formular zu schließen, können mit dem Ereignis-Dispatcher CloseQuery oder der Ereignisbehandlungsroutine für OnCloseQuery abgebrochen werden.
Hinweis: Wenn Sie das Hauptformular der Anwendung schließen, wird das Programm beendet.
Im Quelltext der
VCL findet sich die Lösung zu dem Geheimniss.
Delphi-Quellcode:
procedure TCustomForm.Close;
var
CloseAction: TCloseAction;
begin
if fsModal in FFormState then
ModalResult := mrCancel
else
if CloseQuery then
begin
if FormStyle = fsMDIChild then
if biMinimize in BorderIcons then
CloseAction := caMinimize else
CloseAction := caNone
else
CloseAction := caHide;
DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;
end;
end;
Man beachte:
if Application.MainForm = Self then Application.Terminate
Es wird also bei Form1.Close ein Application.Terminate aufgerufen.
In Deinem Programm kannst Du das so machen:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Hide;
Form2.ShowModal;
Form1.Close;
end;
Damit ist Deine Frage beantwortet.
btw: Es gibt auch den Befehl Halt zum beenden einer Applikation
Den sollte man aber nicht verwenden... (siehe
OH).
ps: Hurra, das ist mein 200. Beitrag (ohne K&T) ich bin nun "Advanced Member"