Закройте и перезапустите текущее приложение в DELPHI

Как я могу это сделать?

по какой-то причине или выбран пользователем, "попросите" текущее приложение перезапустить его самостоятельно.

4 ответов


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;

есть еще один способ закрытия-перезапуск приложения:

сохраните запланированную задачу на короткое время после закрытия приложения. Это должно быть ПОСЛЕДНИЙ вещь, которую ваше приложение делает перед выходом (без дальнейшей обработки данных, сохранения, загрузки или чего-либо еще)

например.

  1. сначала получите системное время
  2. установите запланированную задачу через некоторое время после этого времени (запланированное событие должно будет начать исполняемый файл)
  3. выход из приложения (закрытие основной формы или приложения.terminate сделает это)

когда ваша программа запускается снова, она должна проверить наличие любой такой запланированной задачи и удалить их. Это должно быть ПЕРВЫЙ действие ваше приложение должно делать при запуске. (очистка)

  1. проверьте наличие запланированных задач, созданных исполняемым файлом
  2. удалить их

АФАИК, Дельфийский джедай в наборе компонентов есть компонент, с помощью которого можно выполнять планирование задач.


Я могу добавить к @Andreas Rejbrand ответ:

если код выполнен .файл dpr перед Application.Initialize. для меня лучше позвонить Halt(0) вместо Application.Terminate. Мне это нужно, потому что при первом запуске программа выполняет некоторую установку, а затем перезапускается. Если я позову Application.Terminate основная форма мигает в течение нескольких секунд (но она не должна быть создана вообще!) и затем приложение закрывается. Итак, мой код следующий:

.ДНР:
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;

вы можете иметь отдельный простой перезапуск.exe программа, которую вы запускаете из своей программы и передаете ей имя исполняемого файла. Затем закройте программу. Программа перезапуска может подождать некоторое время или пока исполняемый файл не будет доступен для чтения, что, по-видимому, означает, что он не работает, затем он может выполнить его и закрыть себя.

Я ожидаю, что есть лучший способ сделать это, возможно, sombody может предоставить лучшее решение, но эта функция, похоже, говорит мне, является ли исполняемый файл в настоящее время работает:

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;