Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Neustart der Applikation aus Stabilitätsgründen... (https://www.delphipraxis.net/211311-neustart-der-applikation-aus-stabilitaetsgruenden.html)

BigAl 28. Aug 2022 18:43

Neustart der Applikation aus Stabilitätsgründen...
 
Hallo zusammen,

ich entwickle momentan eine Applikation, welche im Dauerbetrieb stabil laufen muss. Weiterhin sind ein helles und ein dunkles Design gefordert. Da es nach dem Umschalten des Styles immer wieder zu Fehler in der VCL kommt habe ich mich für einen etwas unkonventionellen Weg entschieden. Nachdem der Benutzer das Design ändert (sollte eigentlich nicht oft vorkommen) starte ich die Applikation neu.

Dazu habe ich im Hauptformular folgenden Destructor geschrieben:

Delphi-Quellcode:
destructor TfrmMain.Destroy;
var
  AppName, AppParam: string;
begin
  inherited;

  if SkinChangeRestart then
  begin
    AppName := ParamStr(0);
    AppParam := SKIN_RESTART_PARAM;
    ShellExecute(0, nil, PChar(AppName), PChar(AppParam), nil, SW_SHOW);
  end;
end;
Bei der Konfiguration löse ich das ganze nach einer Sicherheitsabfrage wie folgt aus:

Delphi-Quellcode:
         
  SkinChangeRestart := True;
  Application.MainForm.Close;
Das funktioniert, aber ich bin mir nicht sicher, ob das der richtige Weg ist oder ob man das anders lösen sollte.

Ehe ein Hinweis auf "löse das VCL Problem" kommt: Ich habe ja bereits einen häufig auftretenden Fehler gemeldet (RSP-38928). Ich werde bei Gelegenheit noch einen weiteren Melden der immer wieder auftritt. Mit dem Debuggen solcher Fehler bin ich überfordert bzw. dazu fehlt mir die Zeit. Das die Anwendung in Forms dynamisch erzeugte eingebettete forms und frames enthält macht das ganze nicht leichter. Aber ehe das nicht alles seitens VCL stabil ist brauche ich eine Lösung. Die vorliegende Anwendung wird z.B. ab Oktober in Mexiko und später noch in Brasilien und den USA laufen. Da kann ich nicht mal eben hinfahren...

KodeZwerg 28. Aug 2022 19:06

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Ich empfehle von Herrn Below die OneInstance unit (einfach mal hier danach suchen) zu benutzen. Läuft bei mir seit Jahren perfekt!

BigAl 28. Aug 2022 19:19

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von KodeZwerg (Beitrag 1510903)
Ich empfehle von Herrn Below die OneInstance unit (einfach mal hier danach suchen) zu benutzen. Läuft bei mir seit Jahren perfekt!

Und wie soll die bei meinem Problem helfen? Um eine Instanz sicherzustellen brauchts keine Unit. Das ist mit ein paar Codezeilen erledigt. Mir geht es darum die aktuelle Instanz zu beenden und dann automatisch eine neue zu starten...

KodeZwerg 28. Aug 2022 19:52

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Und genau dafür nutze ich seine Unit, naja wie dem auch sei...

himitsu 28. Aug 2022 22:53

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Reicht es denn nicht die Form neu zu erstellen (wobei es bei der MainForm nicht so einfach ist, das deren Freigabe standardmäßig die Anwendung beendet)
oder zumindestens die Windows-Handles/Controls neu zu generieren?

BigAl 28. Aug 2022 23:04

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Zitat von himitsu (Beitrag 1510910)
Reicht es denn nicht die Form neu zu erstellen (wobei es bei der MainForm nicht so einfach ist, das deren Freigabe standardmäßig die Anwendung beendet)
oder zumindestens die Windows-Handles/Controls neu zu generieren?

Das Problem ist, dass in der Main-Form jede Menge Initialisierung stattfindet. Ok. Die könnte man aus dem constructor / destructor auslagern. Hmm. Die Idee ist nicht schlecht. Wobei beim Umschalten des Styles eh der Handle des Hauptformulars neu erzeugt wird - spricht das Fenster des Hauptformulars vom StyleManager wohl neu erzeugt wird. Dann müsste die aktuelle Sub-Forms restauriert werden usw. Muss ich mir mal anschauen. Weiterhin müsste man wahrscheinlich "Application" austricksen. Und da wird's tricky.

Das Problem mit den Styles ist halt, dass manchmal Fehler direkt beim Umschalten stattfinden und manchmal erst später, wenn Frames neu aufgemacht / erzeugt werden. Meistens funktioniert es aber. Und das macht mir Bauchschmerzen. Ich hasse Fehler, die nicht reproduzierbar sind.

venice2 28. Aug 2022 23:06

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

Und genau dafür nutze ich seine Unit, naja wie dem auch sei...
Es geht hier nicht um eine Instance also sicherstellen das nur eine erlaubt ist
sondern darum die Anwendung neu zu starten.
Dafür braucht man keine extra Unit eine Zeile reicht vollkommen aus.

Ich mache es beim Skin Wechsel auf diese weise.
Delphi-Quellcode:
if Restart then
  Result := ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)
bzw. Dein Variante sollte es auch tun. Sehe da kein Problem.

KodeZwerg 28. Aug 2022 23:21

AW: Neustart der Applikation aus Stabilitätsgründen...
 
offtopic
Nur um das was ich meinte zu vervollständigen, ich nutze diese nicht-gewollte unit weil diese halt möglichkeiten bietet beim zweit-aufruf schon im code die alte instanz zu schließen, neue zu starten, automatisierte aktionen ausführt etc. Klar kann man das auch alles selbst schreiben, muss man aber nicht, war halt nur ein vorschlag. habs nicht bös gemeint.

himitsu 29. Aug 2022 00:43

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Delphi-Quellcode:
Self.RecreateWnd;


Zitat:

Zitat von venice2 (Beitrag 1510914)
Delphi-Quellcode:
if Restart then
  Result := ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)

Im ersten Post war es bereits richig (nur zusätzlich noch mit einem Parameter)
Bei dir nicht. Grund siehe https://www.delphipraxis.net/211304-...ml#post1510883

PS: Wenn man die Anwendung inkl. der ursprünglichen Parameter neu starten will, dann siehe MSDN-Library durchsuchenGetCommandLine. (einfacher als die vielen ParamStr's wieder neu zusammenzusetzen)

BigAl 29. Aug 2022 05:42

AW: Neustart der Applikation aus Stabilitätsgründen...
 
Zitat:

PS: Wenn man die Anwendung inkl. der ursprünglichen Parameter neu starten will, dann siehe MSDN-Library durchsuchenGetCommandLine. (einfacher als die vielen ParamStr's wieder neu zusammenzusetzen)
Der Parameter sagt der Anwendung lediglich, dass der Restart auf Grund des Skin-Wechsels erfolgt. Damit navigiere sie dann wieder direkt an die Stelle, auf der das ganze ausgelöst wurde und schaltet die zum Einstellen benötigten Rechte frei. Das ganze ist eine Oberfläche für das UI einer Industrieanlage, welches zu 100% Touch-gesteuert ist. Es gibt also keine Tastatur. Es ist also ausgeschlossen, dass der Benutzer da Schindluder treibt mit dem Parameter (es gibt keine Tastatur)...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
Seite 1 von 3  1 23      

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