Discussion:
Application.Terminate
(zu alt für eine Antwort)
Alfred Gemsa
2018-11-02 10:26:00 UTC
Permalink
Hallo,

im OnCreate einer Form überprüfe ich, ob ein Netzwerkgerät da ist, indem
ich einen Ping versuche. Im Fehlerfall möchte ich die Anwendung sofort
beenden:

procedure TForm1.OnCreate(....)
begin
if not Pinger.Ping(IPAddr) then begin
ShowMessage('Kein Ping, Abbruch.');
Application.Terminate;
exit; // kein weiteres Ausführen von OnCreate
end;
//
// hier weiterer Code
//
.
.
.
end;

Dummerweise werden aber nach nach dem Verlassen von OnCreate (der
weitere Code wird tatsächlich nicht ausgeführt) noch andere
Ereignisroutinen ausgeführt, die dann zu Fehler führen, da das
Netzwerkgerät nicht da ist.

Mit MadExcept sehe ich, dass noch FormShow und ein CheckboxClick
gefeuert wird.

Dieser Code funktioniert in anderen Anwendungen wir gewünscht, hier
schein das Application.Terminate nicht zu bewirken.


Weiß jemand Rat?

Danke und Gruß,
Alfred
Matthias Hanft
2018-11-02 10:31:44 UTC
Permalink
Post by Alfred Gemsa
Dummerweise werden aber nach nach dem Verlassen von OnCreate (der
weitere Code wird tatsächlich nicht ausgeführt) noch andere
Ereignisroutinen ausgeführt, die dann zu Fehler führen, da das
Netzwerkgerät nicht da ist.
Application.Terminate schreibt ja nur in irgendwelche Message-
Queues, dass das Programm sich bitteschön beenden möge, wenn es
ihm denn eines Tages genehm wäre.

Der sicherste Weg wäre vermutlich, das Ergebnis von Pinger.Ping
in ein "private FPingSuccess" zu schreiben und in OnShow (und
ggf. OnClick, wenn das auch noch aufgerufen wird) am Anfang sowas
wie "if not FPingSuccess then Exit;" reinzuschreiben.

Evtl. hilft auch ein "Application.ProcessMessages" direkt nach
dem "Application.Terminate" (das ist ja schließlich dafür da,
besagte Message-Queue abzuarbeiten). Vermutlich passiert das
aber auch nicht immer 100%ig rechtzeitig vor dem OnShow...

Gruß Matthias.
Alfred Gemsa
2018-11-02 10:45:38 UTC
Permalink
Post by Matthias Hanft
Application.Terminate schreibt ja nur in irgendwelche Message-
Queues, dass das Programm sich bitteschön beenden möge, wenn es
ihm denn eines Tages genehm wäre.
Der sicherste Weg wäre vermutlich, das Ergebnis von Pinger.Ping
in ein "private FPingSuccess" zu schreiben und in OnShow (und
ggf. OnClick, wenn das auch noch aufgerufen wird) am Anfang sowas
wie "if not FPingSuccess then Exit;" reinzuschreiben.
Evtl. hilft auch ein "Application.ProcessMessages" direkt nach
dem "Application.Terminate" (das ist ja schließlich dafür da,
besagte Message-Queue abzuarbeiten). Vermutlich passiert das
aber auch nicht immer 100%ig rechtzeitig vor dem OnShow...
Gruß Matthias.
ProcessMessages ändert nix.

Ja, dieser WorkAround funktioniert (Appl.Terminate und Exit in
FormShow), aber wie gesagt, ich meine, dass es in anderen Anwendung in
FormCreate immer funktioniert hat.

Danke,
Alfred
Alfred Gemsa
2018-11-02 10:33:57 UTC
Permalink
Der CheckboxClick stammt aus FormShow.

Delphi 7.

Alfred.
Post by Alfred Gemsa
Hallo,
im OnCreate einer Form überprüfe ich, ob ein Netzwerkgerät da ist, indem
ich einen Ping versuche. Im Fehlerfall möchte ich die Anwendung sofort
procedure TForm1.OnCreate(....)
begin
  if not Pinger.Ping(IPAddr) then begin
    ShowMessage('Kein Ping, Abbruch.');
    Application.Terminate;
    exit;  // kein weiteres Ausführen von OnCreate
  end;
  //
  // hier weiterer Code
  //
  .
  .
  .
end;
Dummerweise werden aber nach nach dem Verlassen von OnCreate (der
weitere Code wird tatsächlich nicht ausgeführt) noch andere
Ereignisroutinen ausgeführt, die dann zu Fehler führen, da das
Netzwerkgerät nicht da ist.
Mit MadExcept sehe ich, dass noch FormShow und ein CheckboxClick
gefeuert wird.
Dieser Code funktioniert in anderen Anwendungen wir gewünscht, hier
schein das Application.Terminate nicht zu bewirken.
Weiß jemand Rat?
Danke und Gruß,
Alfred
Heiko Rost
2018-11-02 11:34:12 UTC
Permalink
Post by Alfred Gemsa
im OnCreate einer Form überprüfe ich, ob ein Netzwerkgerät da ist, indem
ich einen Ping versuche. Im Fehlerfall möchte ich die Anwendung sofort
...
Dummerweise werden aber nach nach dem Verlassen von OnCreate (der
weitere Code wird tatsächlich nicht ausgeführt) noch andere
Ereignisroutinen ausgeführt, die dann zu Fehler führen, da das
Netzwerkgerät nicht da ist.
Mit MadExcept sehe ich, dass noch FormShow und ein CheckboxClick
gefeuert wird.
Du könntest den Netzwerktest bereits ausführen, bevor die Formulare
überhaupt erstellt werden:

| begin
| if not Pinger.Ping(IPAddr) then begin
| Application.MessageBox('Kein Netzwerk verfügbar','Abbruch');
| halt(1);
| end;
| Application.Initialize;
| Application.CreateForm(TForm1, Form1);
| Application.Run;
| end.

Damit das möglich ist, müssen zu dem Zeitpunkt Pinger und IPAddr bereits
verfügbar sein. Wenn nicht, wäre ein entsprechendes Flag wie in der
Antwort von Matthias noch eine Lösung.

Außerdem solltest Du Dir noch Gedanken darüber machen, ob das
Netzwerkgerät während der Laufzeit des Programms verschwinden kann.
Falls ja, sollte sowieso jeder Fehler beim Netzwerkzugriff entsprechend
behandelt werden, so daß die fehlgeschlagenen Zugriffe in FormShow und
dem Click-Ereignis Teil dieser Fehlerbehandlung werden.

Gruß Heiko
--
Jeder Zwang ist Gift für die Seele.
Ludwig Börne
Alfred Gemsa
2018-11-02 22:18:07 UTC
Permalink
Post by Heiko Rost
Du könntest den Netzwerktest bereits ausführen, bevor die Formulare
| begin
| if not Pinger.Ping(IPAddr) then begin
| Application.MessageBox('Kein Netzwerk verfügbar','Abbruch');
| halt(1);
| end;
| Application.Initialize;
| Application.CreateForm(TForm1, Form1);
| Application.Run;
| end.
Ja, das wird funktionieren.
Danke für den Tip.

Alred

Lesen Sie weiter auf narkive:
Loading...