Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Programm ohne externe Anwendung neu starten! (https://www.delphipraxis.net/85040-programm-ohne-externe-anwendung-neu-starten.html)

kingflo 25. Jan 2007 08:41


Programm ohne externe Anwendung neu starten!
 
Da ich schon oft Artikel gefunden habe, wie man ein Programm am bessten neu startet, diese aber immer auf batch oder anderen Anwendungen bassieren, wollte ich jetzt mal kurz einen kleinen Artikel schreiben, wie man einen Neustart der eigenen Anwendung auch ohne externe Anwendung realisieren kann.

Zuerst erstellen wir eine neue Unit, die den zweiten Start unserer Anwendung abfangen kann z.B so:

Delphi-Quellcode:
unit mutex;

interface

implementation

uses windows,Dialogs,sysutils,forms,messages;

const
  TestTitle = 'StryykeclientTest';
  AppTitle = 'Stryyke Client';
var
  hWnd: THandle;
  param:String;
  paramInt:integer;
Initialization

  paramInt:=0;
  // einen anderen Titel setzen, so dass wir uns
  // nicht selbst finden
  Application.Title:= TestTitle;
  hWnd := FindWindow('TApplication', AppTitle);
  if hWnd <> 0 then
  begin
    param:=StringReplace(ParamStr(1),'/','',[rfReplaceAll]);
   
    // Parameter -----------------------------------------------------------
    if param='restart' then
    paramInt:=99;
    // ---------------------------------------------------------------------
    PostMessage(hWnd,WM_USER+4711, paramInt, 0);
    Application.ProcessMessages();

  end;

  // Wir sind die erste Instanz -> Titel setzen, so
  // dass weitere unsfinden
  Application.Title:= AppTitle;

finalization  

end.
Als nächstes setzen wir ein TApplicationEvents auf unser Hauptformular und tragen in das Ereignis "OnMessage" folgendes ein:

Delphi-Quellcode:
procedure TLoginForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  // -----------------------------------------------------------------------
   if Msg.message = WM_USER+4711  then begin
      if msg.wParam = 99 then begin
       // close application
       close;
      end;
     //-----------------------------------------------------------------------
   end;
  ///////////////////////////////////////////////////////////////////////////
end;
So das wichtigste haben wir geschafft, und wie sich jetzt wohl jeder denken kann, können wir unsere Anwendung folgendermaßen neu starten:

Delphi-Quellcode:
// uses shellApi
shellexecute(HANDLE,'open',PChar(application.exename),'restart',nil,SW_SHOW);
So... das wars, ich hoffe das jemand den artikel gebrauchen kann, und das man ihn einigermaßen versteht.
Da es mein erster Artikel in der Libary ist, hoffe ich, das ich nicht so schlimme Kritik bekomme *g*. Aber da mir die Libary auch schon oft geholfen hat, wollte ich auch mal was sinnvolles reinschreiben.

mfg
Flo

Tod787 24. Aug 2012 13:10

AW: Programm ohne externe Anwendung neu starten!
 
Hab das mal versucht nur leider ohne Erfolg.

Muss ich die Unit mutex einfach nur in mein Projekt einbinden?

Irgendwie wird die Unit beim Programmstart zwar aufgerufen aber bei
Delphi-Quellcode:
if hWnd <> 0 then
geht er nicht in die Bedingung hinein.

DeddyH 24. Aug 2012 13:17

AW: Programm ohne externe Anwendung neu starten!
 
Da wird dann wohl der Fenstertitel nicht stimmen. Man könnte sich aber auch das eigene Fensterhandle als Parameter beim ShellExecute mitgeben, dann muss man das nicht erst suchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.

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