![]() |
AW: Probleme auf neuem Rechner
Zitat:
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. |
AW: Probleme auf neuem Rechner
Zitat:
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:
Update:
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; 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:
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).
procedure TForm1.Button1Click(Sender:TObject);
begin Application.MainForm.Close(); ShowMessage('Können Sie mich sehen?'); end; Beispiel 2:
Delphi-Quellcode:
Hier wird das Beenden der Anwendung sehr wohl um genau diese 5000 Millisekunden verzögert.
procedure TForm1.Button1Click(Sender:TObject);
begin Application.MainForm.Close(); Sleep(5000); end; Fazit: Es ist völlig egal, wo man den Prozess startet, ob vor oder nach dem
Delphi-Quellcode:
. Allerdings würde ich die aktuelle Anwendung/Prozess erst dann beenden, wenn ich den neuen Prozess erfolgreich starten konnte.
Application.MainForm.Close();
Denksport: Wer Lust hat kann sich ja mal überlegen, was hier passiert:
Delphi-Quellcode:
Allerdings sollte man erst raten, es dann ausprobieren und dann dafür eine Erklärung finden.
procedure TForm1.Button1Click(Sender:TObject);
begin Application.MainForm.Close(); ShowMessage('Können Sie mich sehen?'); Sleep(5000); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz