web-dev-qa-db-ja.com

DELPHIで現在のアプリケーションを閉じて再起動します

どうすればこれを行うことができますか?

何らかの理由で、またはユーザーが選択した場合は、現在のアプリケーションに「要求」して、自分で再起動します。

19
DRokie
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;
27

@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;
_
2
Artem Mostyaev

アプリケーションを閉じる-再起動する別の方法があります。

アプリケーションを閉じた後、スケジュールされたタスクを短時間に保存します。これは非常に最後アプリケーションが終了する前に行うことである必要があります(それ以上のデータ処理、保存、アップロードなどは必要ありません)

例えば。

  1. 最初にシステム時刻を取得する
  2. この時間の少し後にスケジュールされたタスクを設定します(スケジュールされたイベントは実行可能ファイルを開始する必要があります)
  3. アプリケーションを終了します(メインフォームまたはapplication.terminateを閉じると実行されます)

プログラムが再開すると、そのようなスケジュールされたタスクをチェックして削除する必要があります。これは、アプリケーションの起動時に実行する必要があるVERY FIRSTアクションである必要があります。 (掃除)

  1. 実行可能ファイルによって作成されたスケジュールされたタスクを確認します
  2. それらを削除します

AFAIK、Delphi Jediコンポーネントセットには、タスクのスケジューリングを行うことができるコンポーネントが含まれています。

2
beerwin

プログラムから実行する別の単純な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;
1
soid