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