Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: application beendet sich nicht

  Alt 5. Aug 2004, 11:28
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?
OH
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;

OH
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"
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat