Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Wie kann ich mich selbst neu starten? (https://www.delphipraxis.net/168824-wie-kann-ich-mich-selbst-neu-starten.html)

eholzer 13. Jun 2012 07:31

Wie kann ich mich selbst neu starten?
 
Hallo,

wie kann ich das erreichen:
- in eigenem laufendem Programm treffe ich die Entscheidung, dass ich mich neu starten muss
- ich kann irgendwelchen Programmstatus irgendwo wegschreiben
- ich beende mich selber zuerst
- ich starte mich automatisch neu

Der Anwender sollte nur merken, dass das Programmfenster geschlossen und neu geöffnet wird, aber er sollte nicht gezwunden sein das Programm selber neu zu starten.

Danke,

Eric

t0mmy 13. Jun 2012 07:33

AW: Wie kann ich mich selbst neu starten?
 
ShellExecute
und Close

Edit: Hier noch ein hilfreicher Link hättest mit der Suche auch finden können:

http://www.delphipraxis.net/111129-n...programms.html

eholzer 13. Jun 2012 07:50

AW: Wie kann ich mich selbst neu starten?
 
Zitat:

ShellExecute
und Close
Das ist nicht die gewünschte Reihenfolge.

Eric

t0mmy 13. Jun 2012 07:51

AW: Wie kann ich mich selbst neu starten?
 
Dann halt zuerst Close und ShellExecute hab auf die schnelle geantwortet ;)

DeddyH 13. Jun 2012 07:56

AW: Wie kann ich mich selbst neu starten?
 
Zitat:

Zitat von eholzer (Beitrag 1170562)
Das ist nicht die gewünschte Reihenfolge.

Naja, ein Programm, das nicht mehr läuft, kann sich aber schwerlich selbst starten ;)

t0mmy 13. Jun 2012 08:09

AW: Wie kann ich mich selbst neu starten?
 
Theoretisch stimm ich DeddyH zu ;), jedoch funktionieren beide varianten sowie Close-ShellExecute als auch ShellExecute-Close

jaenicke 13. Jun 2012 08:19

AW: Wie kann ich mich selbst neu starten?
 
Und wenn aus irgendwelchen unerfindlichen Gründen die sich beendende Instanz nicht parallel mit der neu startenden laufen soll, dann kannst du ja beim Start warten bis die alte beendet ist und erst dann weiterstarten.

Da das aber die Wartezeit für den Benutzer unnötig verlängert, verstehe ich nicht wozu das gut sein soll...

DeddyH 13. Jun 2012 08:21

AW: Wie kann ich mich selbst neu starten?
 
Normalerweise würde man aber wohl noch auswerten wollen, ob der erneute Start auch funktioniert.
Da wäre dann IMO die einfachste Möglichkeit so etwas:
Delphi-Quellcode:
if ShellExecute(0, 'open', PChar(ParamStr(0)), nil, nil, SW_SHOWDEFAULT) > 32 then
  Close
else
  ShowMessage('Oops');
Oder man definiert sich ein privates Boolean-Feld, wertet das im OnClose aus und ruft dann einfach Close auf, nachdem man das Feld ggf. gesetzt hat.

Iwo Asnet 13. Jun 2012 08:41

AW: Wie kann ich mich selbst neu starten?
 
Zitat:

Zitat von DeddyH (Beitrag 1170572)
Delphi-Quellcode:
if ShellExecute(...) > 32 then

:kotz: magic numbers im Code.

DeddyH 13. Jun 2012 08:47

AW: Wie kann ich mich selbst neu starten?
 
Ich dachte, allein das ShowMessage('Oops') würde schon verdeutlichen, dass das kein Code sein soll, den man produktiv einsetzen sollte. Dann muss ich das demnächst für die Forenpolizisten wohl noch extra dazuschreiben :roll:

himitsu 13. Jun 2012 08:52

AW: Wie kann ich mich selbst neu starten?
 
Die 32 ist keine "Magic-Number" ... das ist ein offizieller Wert, wie man ihn auch im MSDN nachlesen kann.
Zitat:

Zitat von MSDN: ShellExecute
If the function succeeds, it returns a value greater than 32.

Delphi-Quellcode:
if ShellExecute(...) and not $1F <> 0 then
... hier wäre ein unentzifferbare Magic-Number drin.

DeddyH 13. Jun 2012 09:04

AW: Wie kann ich mich selbst neu starten?
 
Delphi-Quellcode:
const
  MAX_SHELLEXECUTE_ERRORVALUE = 32;
:mrgreen:

blackfin 13. Jun 2012 11:20

AW: Wie kann ich mich selbst neu starten?
 
Ich mache das meistens so, dass ich der Anwendung über ShellExecute einen Parameter "-delayed" mitschicke, woraufhin die Anwendung am Anfang etwas wartet
(und die derzeitig laufende Instanz etwas Zeit bekommt, sich zu beenden):

Restart-Routine:

Delphi-Quellcode:
// Restart the Application
procedure ApplicationRestart(const Delayed: boolean = false);
var
  AppName : PChar;
  FParams : PChar ;
begin
  AppName := PChar(Application.ExeName) ;

  if Delayed then
  begin
    FParams := '-delayed' ;
  end;

  ShellExecute(Application.Handle,'open', AppName, FParams, nil, SW_SHOWNORMAL) ;
  Application.Terminate;
end;
Und in der dpr des Programms habe ich dann folgenden Code, der wartet, bevor die Hauptform erzeugt wird und die Anwendung gestartet wird:

Delphi-Quellcode:

begin
  Application.Initialize;
  Application.Title := 'Meine tolle Anwendung';

  // delayed start of application
  if (ParamCount > 0) then
  begin
    if (ParamStr(1) = '-delayed') then
    begin
      sleep(3000) ; // Wartezeit natürlich variabel :-)
    end;
  end;

  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
Hat bisher immer super geklappt. Sollte das aus irgendwelchen Gründen Mist sein, bitte melden! :-)
Natürlich kann man das verbessern...dass z.B. nicht der erste Parameter das "-delayed" sein muss und die Wartezeit auch als zusätzlicher Parameter mitgeschickt wird etc.

Iwo Asnet 13. Jun 2012 13:16

AW: Wie kann ich mich selbst neu starten?
 
Zitat:

Zitat von himitsu (Beitrag 1170583)
Die 32 ist keine "Magic-Number" ... das ist ein offizieller Wert

Trotzdem ist es ein magic number ;-)

Zitat:

Zitat von DeddyH (Beitrag 1170581)
Dann muss ich das demnächst für die Forenpolizisten wohl noch extra dazuschreiben :roll:

Selber :roll:, zick nich so rum, alte Hippe :mrgreen:
Zitat:

Zitat von DeddyH (Beitrag 1170584)
Delphi-Quellcode:
const
  MAX_SHELLEXECUTE_ERRORVALUE = 32;

Siehste, geht doch. :cheer:

eholzer 13. Jun 2012 14:24

AW: Wie kann ich mich selbst neu starten?
 
Danke für eure Antworten, das ist jetzt genug Stoff um weiter zu machen.

Eric

EWeiss 13. Jun 2012 14:53

AW: Wie kann ich mich selbst neu starten?
 
Dann von mir noch einen

Delphi-Quellcode:
  if Restart then
    Result := ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)
  else
  Result := Msg.wParam;
Zitat:

ShellExecute(Application.Handle,'open', AppName, FParams, nil, SW_SHOWNORMAL) ;
Application.Terminate;
Warum hier ein Handle ist doch eh nicht mehr gültig da reicht auch ein 0

gruss

blackfin 13. Jun 2012 15:08

AW: Wie kann ich mich selbst neu starten?
 
Zitat:

ist doch eh nicht mehr gültig
Stimmt nicht ganz, das Terminate / Close kommt in meinem Code danach und die Anwendungen laufen am Anfang ja zunächst parallel. Aber ne 0 tuts natürlich auch :-)

EWeiss 13. Jun 2012 15:19

AW: Wie kann ich mich selbst neu starten?
 
Zitat:

Zitat von blackfin (Beitrag 1170685)
Zitat:

ist doch eh nicht mehr gültig
Stimmt nicht ganz, das Terminate / Close kommt in meinem Code danach und die Anwendungen laufen am Anfang ja zunächst parallel. Aber ne 0 tuts natürlich auch :-)

Ich meinte natürlich das wenn die Anwendung beendet ist ist das Handle nicht mehr gültig
daher macht es keinen sinn das mit zu übergeben ;)

gruss

jaenicke 13. Jun 2012 18:59

AW: Wie kann ich mich selbst neu starten?
 
Wichtig ist das Handle zur Positionierung des neuen Programms. Wenn man 0 angibt, wird z.B. beim Verb runas die UAC nicht direkt angezeigt, sondern blinkt nur in der Taskleiste.


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