Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm neustarten (https://www.delphipraxis.net/65877-programm-neustarten.html)

R2D2 21. Mär 2006 18:23


Programm neustarten
 
Hallo!

Ich habe eine Application, die ich neustaren möchte.

An sich kein Problem, ShellExcecute und Application.Terminate.

Aber:

Das Programm ist leider so konzepiert, dass es nur einmal geöffnet sein kann!

Demnach funktionniert das alles nicht! :wall:

Wie kann ich jetzt das Programm starten, nachdem es beendet wurde???

Matze 21. Mär 2006 18:25

Re: Programm neustarten
 
Hi

Du könntest beim Neustarten einen Parameter mitgeben, den du auswertest. Ist dieser Paremeter gesetzt, lässt sich das Programm zweimal starten, ansonsten eben nur einmal. Keine Ahnung, ob das die beste Möglichkeit ist, doch das ist mir dazu gerade eingefallen.

markusj 21. Mär 2006 18:43

Re: Programm neustarten
 
Oder du startest über ein drittes Programm, ein kleines Hilfsprogramm deine Applikation neu.

mfG

Markus

R2D2 21. Mär 2006 18:45

Re: Programm neustarten
 
Muss ich wohl so machen. Schade, dass es da keinen Befehl gibt.

Trotzdem Danke!

himitsu 21. Mär 2006 18:50

Re: Programm neustarten
 
Oder du läßt das Programm beim Start ein/zwei Sekunden warten, bevor es prüft ob es schonmal gestartet wurde, damit die andere Instanz genug Zeit hat, um sich zu beenden.

Die Muhkuh 21. Mär 2006 18:54

Re: Programm neustarten
 
Mit ner Batch müsste das evtl. auch gehen?!

_frank_ 21. Mär 2006 18:59

Re: Programm neustarten
 
Hi,
evtl. hilft eine Bat-Datei:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sl:Tstringlist;
begin
  sl:=TStringlist.create;
  //evtl. wird hier eine verzögerung benötigt (kann mittels ping realisiert werden)
  sl.Add('start '+paramstr(0));
  sl.add('del %0');
  sl.savetofile(extractfilepath(paramstr(0))+'test.bat');
  sl.free;
  application.terminate;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  winexec(PCHAR(extractfilepath(paramstr(0))+'test.bat'),sw_hide);
end;
in meinem Test hat es so funktioniert... (muss evtl. noch verfeinert werden)

Gruß Frank

ErazerZ 21. Mär 2006 19:11

Re: Programm neustarten
 
hey,
es geht auch ohne ne bat datei, dazu musst du (falls du CreateMutex benutzt) einfach das public deklarieren, und vor dem neustarten einfach das handle schließen
zb:
// DPR datei
Delphi-Quellcode:
program Project1;

uses
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
  hMutex: THandle;
begin
  hMutex := CreateMutex(nil, True, 'MeinProgram');
  if (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    CloseHandle(hMutex);
    MessageBox(0, 'Sie können nicht das Prog nur einmal starten', 'App', MB_ICONERROR);
    ExitProcess(0);
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Form1.hMutex := hMutex; // wo die form erstellt wurde dann in form1, das übergeben, macht man es vor dem createform dann kommt es zu einer zugriffsverletzung ..
  Application.Run;
end.
// und das hier ist die funktion wo neustarten gemacht wird
Delphi-Quellcode:
uses
  ShellApi;

type
  TForm1 = class(TForm)
    btnNeustarten: TButton;
    procedure btnNeustartenClick(Sender: TObject);
  private
    { Private declarations }
  public
    hMutex: THandle;
    { Public declarations }
  end;

procedure TForm1.btnNeustartenClick(Sender: TObject);
begin
  // zuerst schließen wir das mutex handle und dann einfach ShellExecute, Terminate ..
  CloseHandle(hMutex);
  ShellExecute(Handle, 'open', PChar(Application.ExeName), nil, nil, SW_NORMAL);
  Application.Terminate;
end;
cya, ErazerZ


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