どうすればこれを行うことができますか?
何らかの理由で、またはユーザーが選択した場合は、現在のアプリケーションに「要求」して、自分で再起動します。
uses ShellAPI;
...
procedure TForm1.RestartThisApp;
begin
ShellExecute(Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
Application.Terminate; // or, if this is the main form, simply Close;
end;
@Andreas Rejbrandの回答に追加できます:
コードが_Application.Initialize.
_の前に.dprファイルで実行されている場合は、_Application.Terminate
_ではなくHalt(0)
を呼び出すことをお勧めします。最初の起動時にプログラムがインストールを実行してから再起動するため、これが必要です。 _Application.Terminate
_を呼び出すと、メインフォームが1秒間点滅し(ただし、まったく作成されるべきではありません!)、アプリケーションが閉じます。だから私のコードは次のとおりです:
project.dpr:
_if FirstRun then
begin
DoFirstRunStuff();
ShellExecute(Application.Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
Halt(0);
end;
...
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
_
アプリケーションを閉じる-再起動する別の方法があります。
アプリケーションを閉じた後、スケジュールされたタスクを短時間に保存します。これは非常に最後アプリケーションが終了する前に行うことである必要があります(それ以上のデータ処理、保存、アップロードなどは必要ありません)
例えば。
プログラムが再開すると、そのようなスケジュールされたタスクをチェックして削除する必要があります。これは、アプリケーションの起動時に実行する必要があるVERY FIRSTアクションである必要があります。 (掃除)
AFAIK、Delphi Jediコンポーネントセットには、タスクのスケジューリングを行うことができるコンポーネントが含まれています。
プログラムから実行する別の単純なrestart.exeプログラムを作成して、実行可能ファイルの名前を渡すことができます。次に、プログラムを閉じます。再起動プログラムは、しばらく待つか、実行可能ファイルが読み取り/書き込み可能になるまで待つことができます。これは、実行されていないことを意味しているように見えます。その後、プログラムを実行して、それ自体を閉じることができます。
これを行うためのより良い方法があると思います。誰かがより良い解決策を提供できるかもしれませんが、この関数は実行可能ファイルが現在実行されているかどうかを教えてくれるようです。
function CanReadWriteFile(const f: TFileName): boolean;
var
i: integer;
begin
Result := false;
i := FileOpen(f, fmOpenReadWrite);
if i >= 0 then begin
Result := true;
FileClose(i);
end;
end;