AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

application beendet sich nicht

Ein Thema von Borti · begonnen am 5. Aug 2004 · letzter Beitrag vom 6. Aug 2004
Antwort Antwort
Borti

Registriert seit: 11. Okt 2003
151 Beiträge
 
#1

application beendet sich nicht

  Alt 5. Aug 2004, 10:41
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?
Danke,
Borti
Ich hab's versucht
(auch wenn's nicht so aus sieht)
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: application beendet sich nicht

  Alt 5. Aug 2004, 10:46
Hallo,
Um eine Delphi Anwendung zu beenden, kannst du alternativ entweder
form1.close ; verwenden, oder application.terminate ; .

Bei der ersten Variante muß form1 dein Hauptformular sein.

Gruß,
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 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
Borti

Registriert seit: 11. Okt 2003
151 Beiträge
 
#4

Re: application beendet sich nicht

  Alt 6. Aug 2004, 11:28
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
Ich hab's versucht
(auch wenn's nicht so aus sieht)
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#5

Re: application beendet sich nicht

  Alt 6. Aug 2004, 11:51
Warum musst du unbedingt den Speicher von Form1 freigeben, bevor Form2 erscheint?

Wenn Form1 deine Hauptform ist und du diese freigibst beendest du damit dein Programm. Wurde ja schon öfter erwähnt.

Grüße,
Mario
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

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

Re: application beendet sich nicht

  Alt 6. Aug 2004, 12:01
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.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

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

Re: application beendet sich nicht

  Alt 6. Aug 2004, 12:04
Zitat von Nuclear-Ping:
Wenn Form1 deine Hauptform ist und du diese freigibst beendest du damit dein Programm. Wurde ja schon öfter erwähnt.
Das stimmt nicht!
Das ist ja sein Problem!

Das Freigeben aleine (Form1.Release reicht nicht aus.
Nur ein Application.MainForm.Close; beendet auch die App.
(Application.Mainform = Form1)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#8

Re: application beendet sich nicht

  Alt 6. Aug 2004, 12:29
Meinte auch mit Freigeben = Close.

Mir ist nur nicht klar, warum er das unbedingt so haben muss und was er damit bezweckt.
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

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

Re: application beendet sich nicht

  Alt 6. Aug 2004, 13:30
Zitat von Nuclear-Ping:
Mir ist nur nicht klar, warum er das unbedingt so haben muss und was er damit bezweckt.
Das weiß ich auch nicht.

Aber die Frage:
Zitat von Borti:
Erst mit application.terminate beendet sich auch die gesammte Anwendung. Aber warum?
ist nun beantwortet. -> offene Frage bitte schliessen.
Danke
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 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