Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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;

Ответ 2

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

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

например.

  • сначала получить системное время
  • установить запланированное задание через некоторое время после этого времени (запланированное событие должно будет запустить ваш исполняемый файл)
  • выйти из приложения (закрытие основной формы или application.terminate сделает это)

Когда ваша программа запустится снова, она должна проверить любую запланированную задачу и удалить ее. Это должно быть действие VERY FIRST, которое ваше приложение должно делать при запуске. (Очистка)

  • проверить любые запланированные задачи, созданные вашим исполняемым файлом
  • удалить их

AFAIK, у компонента компонентов Delphi Jedi есть компонент, с которым вы можете выполнять планирование задач.

Ответ 3

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

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

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;

Ответ 4

У вас может быть отдельная простая программа 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;