Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Probleme auf neuem Rechner (https://www.delphipraxis.net/201495-probleme-auf-neuem-rechner.html)

DieDolly 27. Jul 2019 17:46

AW: Probleme auf neuem Rechner
 
Zitat:

Das ist nämlich definitiv nicht so.
Die Application endet nicht einfach in einer Methode!!!!!!
Ich behaupte was anderes.
Du kannst das ja mal testen. Schreib ein showmessage in die Events OnClose, OnCloseQuery und OnDestroy.
Ohne es getestet zu haben sollten alle Messageboxen bis OnDestroy durchlaufen bevor jemals ShellEcecute aufgerufen wird.

Schokohase 27. Jul 2019 17:58

AW: Probleme auf neuem Rechner
 
Zitat:

Zitat von Luckie (Beitrag 1437808)
Das stimmt. Aber aussteigen und gleichzeitig wieder einsteigen wollen, ist auch in der Programmiernung problematisch.

Mag sein, ist aber in diesem Fall völlig unerheblich.

Es soll ein neuer Prozess gestartet werden (zufälligerweise die gleiche Anwendung wie die aktuell läuft).
Der aktuelle Prozess soll beendet werden.

Da es sich um zwei völlig voneinander unabhängige Prozesse handelt ist das ohne große Schwierigkeiten zu bewältigen.

@DieDolly
Wenn man die MainForm schließt, dann wird die Anwendung nicht hart beendet, sondern die Anwendung dümpelt da noch ein wenig herum und sendet lustig Nachrichten und beendet sich dann ganz sauber und kontrolliert.

So funktioniert es mit Delphi 10.3.2 egal ob in einem Verzeichnis mit Leerzeichen oder ohne. Aber falls es nicht gestartet werden könnte, dann wird nun eine aussagekräftige Fehlermeldung ausgegeben.
Delphi-Quellcode:
var
  ReturnValue: HINST;
begin
  ReturnValue := ShellExecute(self.Handle, 'open', PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
  if ReturnValue < 32 then
    RaiseLastOSError();
  Application.MainForm.Close();
end;
Update:

Beim Beenden der Anwendung auf so etwas wie ShowMessage zu setzen und daraus eine Schlußfolgerung zu ziehen ist sehr schlecht, denn auch dieser Dialog (aufgerufen von ShowMessage) bekommt eine Nachricht sich doch bitte wieder zu schließen, was dieser dann auch ohne zu zögern macht.

Beispiel 1:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
  Application.MainForm.Close();
  ShowMessage('Können Sie mich sehen?');
end;
Leider wird hier weder ein Dialog angezeigt, noch ist dieser Aufruf blockierend (weil das Öffnen/Anzeigen quasi zeitgleich mit der Schließen-Anforderung erfolgt und wir nicht schnell genug schauen können, bzw. auch der Monitor zu träge ist).

Beispiel 2:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
  Application.MainForm.Close();
  Sleep(5000);
end;
Hier wird das Beenden der Anwendung sehr wohl um genau diese 5000 Millisekunden verzögert.

Fazit:

Es ist völlig egal, wo man den Prozess startet, ob vor oder nach dem
Delphi-Quellcode:
Application.MainForm.Close();
. Allerdings würde ich die aktuelle Anwendung/Prozess erst dann beenden, wenn ich den neuen Prozess erfolgreich starten konnte.

Denksport:
Wer Lust hat kann sich ja mal überlegen, was hier passiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
  Application.MainForm.Close();
  ShowMessage('Können Sie mich sehen?');
  Sleep(5000);
end;
Allerdings sollte man erst raten, es dann ausprobieren und dann dafür eine Erklärung finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.
Seite 3 von 3     123   

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