Delphi-PRAXiS
Seite 2 von 2     12   

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)

himitsu 13. Jun 2012 09: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 10:04

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

blackfin 13. Jun 2012 12: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 14: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 15: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 15: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 16: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 16: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 19: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 02:39 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz