Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Application beenden vor erstem Erzeugen von Form (https://www.delphipraxis.net/168721-application-beenden-vor-erstem-erzeugen-von-form.html)

RalfSi 6. Jun 2012 16:38

Application beenden vor erstem Erzeugen von Form
 
Hallo zusammen,

ich verstehe nicht, wie Applicationen korrekt beendet werden.

Delphi-Quellcode:
Application.Initialize;
{hier prüfe ich, ob einen Datei vorhanden ist]
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
Wenn ich feststelle, dass die Datei nicht vorhanden ist, soll CreateForm nicht aufgerufen und das Programm gleich beendet werden.
Wenn ich bspw. in der Prüfung Application.Destroy einfüge und das Erstellen der Form von Application.Terminated abhängig mache, also bspw.


Delphi-Quellcode:
Application.Initialize;
Application.Destroy;
if not Application.Terminated then
begin
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end;
, dann wird das Programm mit Fehler und Fenster beendet ".... funktioniert nicht mehr. Windows kann online nach einer Lösung für das Problem suchen.
online nach einer Lösung suchen und das Programm schließen
Programm schließen
Programm debuggen"

Wenn ich das Fenster schließe folgt der nächste Hinweis
Exception EReadError in module rtl100.bpl at 00038183 Fehler beim Lesen von Statusbar.Panels: Systemfehler. Code 1400. Ungültiges FEnsterhandle."

Wie muss ich denn im Falle, dass die entsprechende Datei nicht vorliegt, die Application beenden?

Gruß
Ralf

dominikkv 6. Jun 2012 16:43

AW: Application beenden vor erstem Erzeugen von Form
 
Delphi-Quellcode:
Halt(0);

RalfSi 6. Jun 2012 16:51

AW: Application beenden vor erstem Erzeugen von Form
 
Danke. Aber dennoch die Frage, warum es mit Application.Destroy nicht funktioniert?

himitsu 6. Jun 2012 16:56

AW: Application beenden vor erstem Erzeugen von Form
 
Man ruft nicht direkt Destroy auf.

Delphi-Quellcode:
Application.Free;
if not Application.Terminated the
Und jetzt rate mal, was du da machst?

Genau, du erzeugst eine Exception, da du versuchst ein Objekt (TApplication) zu nutzen, welches nicht mehr existiert und da du an dieser Stelle keine Exceptions mehr abfängst/verarbeitest, schmiert gleich die ganze Anwendung ordentlich ab.


Von Halt würde ich abraten.
Das ist so, als wenn du bei 200 km/h 'nen Anker aus'm Auto wirfst, anstatt mit angemessener Geschwindigkeit abzubremsen.



Delphi-Quellcode:
Application.Initialize;
{hier prüfe ich, ob einen Datei vorhanden ist}
if darf_starten then begin
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end;
oder notfalls
Delphi-Quellcode:
Application.Initialize;
{hier prüfe ich, ob einen Datei vorhanden ist}
if not darf_starten then
  Application.Terminate;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
Du kannst aber auch mal Delphi-Referenz durchsuchenExit probieren
Delphi-Quellcode:
Application.Initialize;
{hier prüfe ich, ob einen Datei vorhanden ist}
if not darf_starten then
  Exit;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;

Popov 6. Jun 2012 17:04

AW: Application beenden vor erstem Erzeugen von Form
 
Gegen Halt habe ich nichts, an der richtigen Stelle. Ansonsten ist evtl. besser Application.Terminate besser.

RalfSi 6. Jun 2012 17:14

AW: Application beenden vor erstem Erzeugen von Form
 
Application.Terminate und/bzw. Exit habe mir nichts gebracht.
Der Code nach Terminate wird dennoch ausgeführt und exit brachte Fehlermeldungen in irgendwelchen bpls.
Ich hab's nun so gemacht, dass ich die Lösung angehe:

Code:
if darf_starten then begin
   Application.CreateForm(TfrmMain, frmMain);
   Application.Run;
 end;
Dennoch bleibt mir das mit dem Terminate/Destroy unverständlich (gerade auch, weil ich das Gefühl habe, dass Application.Terminate nichts zur Folge hat, außer Fehlermeldungen).

Popov 6. Jun 2012 18:08

AW: Application beenden vor erstem Erzeugen von Form
 
Was macht
Delphi-Quellcode:
Application.Destroy
? Löst die Instanz und gibt den Speicher frei! Was passiert wenn du dann fragst
Delphi-Quellcode:
if not Application.Terminated
? Du greifst noch mal auf das
Delphi-Quellcode:
Application
Objekt zu, das du gerade feigegeben hast. Klar das es da knallt.

Vielleicht an einem Beispiel verdeutlicht:

Delphi-Quellcode:
var
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  StringList.Free;
  StringList.Add('Viel Spaß');
end;
Was stimmt hier nicht?

Furtbichler 6. Jun 2012 18:15

AW: Application beenden vor erstem Erzeugen von Form
 
Antwort: 'Viel Spaß' ist deplaziert. Rein emotionell. :stupid:

jaenicke 6. Jun 2012 19:48

AW: Application beenden vor erstem Erzeugen von Form
 
Zitat:

Zitat von Popov (Beitrag 1169729)
Gegen Halt habe ich nichts, an der richtigen Stelle. Ansonsten ist evtl. besser Application.Terminate besser.

Da es dafür (in 99,99% der Fälle) keine richtige Stelle gibt, kann ich der Aussage voll zustimmen. :mrgreen:

Popov 6. Jun 2012 19:58

AW: Application beenden vor erstem Erzeugen von Form
 
Du solltest nicht immer so negativ denken, vielleicht fehlt dir für den Einsatz einfach nur die Phantasie.

BUG 6. Jun 2012 20:13

AW: Application beenden vor erstem Erzeugen von Form
 
Zitat:

Zitat von RalfSi (Beitrag 1169731)
Dennoch bleibt mir das mit dem Terminate/Destroy unverständlich (gerade auch, weil ich das Gefühl habe, dass Application.Terminate nichts zur Folge hat, außer Fehlermeldungen).

Ganz einfach: Das Zerstören des Application-Objekts oder Application.terminate beendet das Programm nicht, sondern sondern zerstört nur die Message-Queue.
Es kann aber auch Programme ohne Message-Queue geben, auch wenn das nicht besonders Windows-typisch ist.

Wenn du dich näher mit den Grundlagen (also was unter anderem hinter diesem Objekt steckt) beschäftigen willst, kannst du dir das Win32-Tutorial von Luckie angucken.

jaenicke 6. Jun 2012 20:29

AW: Application beenden vor erstem Erzeugen von Form
 
Zitat:

Zitat von Popov (Beitrag 1169745)
Du solltest nicht immer so negativ denken, vielleicht fehlt dir für den Einsatz einfach nur die Phantasie.

Naja, bei den potentiellen schwerwiegenden Nebenwirkungen für Programm und System fällt mir da in der Tat wenig ein, außer zum Debuggen bei der Entwicklung.

Popov 6. Jun 2012 20:34

AW: Application beenden vor erstem Erzeugen von Form
 
Zum Beispiel.

jaenicke 6. Jun 2012 21:43

AW: Application beenden vor erstem Erzeugen von Form
 
Offene Handles und von der Anwendung genutzter Speicher wird seit Windows NT/Windows 2000 von Windows automatisch freigegeben.
Vorher, bei Windows 9x, gab es das so nicht, da führte Halt ggf. auch dort zu Problemen.

Bei geladenen DLLs und Systemobjekten klappt die automatische Freigabe aber offenbar leider nicht immer, zumindest bis XP (bei Vista/7/8 habe ich noch keine solchen Probleme mehr gehabt), wenn das Programm abgeschossen wird. Das führt meistens nicht zu größeren Problemen, aber es kann auch passieren, dass man Windows irgendwann neustarten muss. Was da genau schief geht, weiß ich nicht, weil ich es mir nie genauer angeschaut habe.

Luckie 6. Jun 2012 21:57

AW: Application beenden vor erstem Erzeugen von Form
 
Wollte gerade sagen, wenn ein Prozess terminiert wird, gibt Windows alle Ressourcen frei und schließt alle offenen Handles. Und über Windows 9x brauchen wir uns wohl nicht mehr unterhalten. ;) Nichts desto trotz bin ich der Meinung, man soll selber den Müll wegräumen, den man angehäuft hat. Hab eich zumindest in meiner Erziehung so gelernt.

BUG 6. Jun 2012 22:58

AW: Application beenden vor erstem Erzeugen von Form
 
Zitat:

Zitat von Luckie (Beitrag 1169757)
Wollte gerade sagen, wenn ein Prozess terminiert wird, gibt Windows alle Ressourcen frei und schließt alle offenen Handles.

Sollte es.

Aber wer weiß, wie Windows 1337 mit Ressourcen umgeht? Oder ReactOS? Oder WINE?
Im besten Fall werden die sich an die API Dokumentation halten.

Also sollte man zumindest dafür sorgen, dass sich zumindest der Code, den man selbst kontrolliert, sich entsprechend der Spezifikation verhält.
Dabei kann er auch auf geringe Abweichung von der Spezifikation in den nicht kontrollierten Komponenten behandeln (vgl. strikte Sender und relaxte Empfänger in Netzwerk-Protokollen).


PS: Das ist allgemein gemeint, also direkt nicht an Luckie gerichtet. Das Zitat ist nur der Aufhänger.

himitsu 7. Jun 2012 08:00

AW: Application beenden vor erstem Erzeugen von Form
 
Die Message-Queue wird nicht zerstört ... sie wird einfach nur nicht mehr abgearbeitet, was Delphi in Application.Run und Application.ProgressMessages macht.

Konsolenanwendungen kommen ohne Message-Queue aus, da sie standardmäßig nichts mit "Fenstern" Machen.

Chemiker 7. Jun 2012 10:25

AW: Application beenden vor erstem Erzeugen von Form
 
Hallo,

Zitat:

Wenn ich feststelle, dass die Datei nicht vorhanden ist, soll CreateForm nicht aufgerufen und das Programm gleich beendet werden.
Was soll das für ein Vorteil bringen, ohne den Benutzer zu informieren, dass noch eine bestimmte Datei fehlt, das Programm ohne weiteren Kommentar zu beenden. Besser ist es doch das Form zu zeigen eine Fehlermeldung anzuzeigen und dann das Programm, ohne Klimmzüge sauber zu beenden.

Bis bald Chemiker

Maya 7. Jun 2012 11:18

AW: Application beenden vor erstem Erzeugen von Form
 
Zitat:

Zitat von Chemiker (Beitrag 1169804)
Hallo,

Zitat:

Wenn ich feststelle, dass die Datei nicht vorhanden ist, soll CreateForm nicht aufgerufen und das Programm gleich beendet werden.
Was soll das für ein Vorteil bringen, ohne den Benutzer zu informieren, dass noch eine bestimmte Datei fehlt, das Programm ohne weiteren Kommentar zu beenden. Besser ist es doch das Form zu zeigen eine Fehlermeldung anzuzeigen und dann das Programm, ohne Klimmzüge sauber zu beenden.

Bis bald Chemiker

Ich möchte für diesen Beitrag einen "Gefällt mir"-Button. :thumb:

Sir Rufo 7. Jun 2012 12:57

AW: Application beenden vor erstem Erzeugen von Form
 
So sollte das sauber sein (unabhängig davon, ob das user-friendly oder sinnvoll ist)
Delphi-Quellcode:
if not SomethingMissing then
begin
  Application.Initialize;
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end;
Denn jetzt verhält sich die Anwendung wie eine Konsolen-Anwendung, wenn die Anfangsbedingung nicht zutrifft.

himitsu 7. Jun 2012 14:03

AW: Application beenden vor erstem Erzeugen von Form
 
Und der Rest ist ja auch nicht schwer:
Delphi-Quellcode:
end
else
  MessageBox(0, 'da fehlt irgendwas', PChar(ExtractFileName(ParamStr(0))), MB_OK or MB_ICONERROR);
Delphi-Quellcode:
end
else
  MessageBox(0, PChar('da fehlt ' + Fehlendes), PChar(ExtractFileName(ParamStr(0))), MB_OK or MB_ICONERROR);

Bummi 7. Jun 2012 14:36

AW: Application beenden vor erstem Erzeugen von Form
 
einen hab ich noch
Delphi-Quellcode:
if 1=0 then
  begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
  end
else
  begin
      if Windows.AllocConsole then
      try
        WriteLn('Shit happens ...');
        write('> ');
        readln;
      finally
        FreeConsole;
      end;

  end;


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