Закройте и перезапустите текущее приложение в 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;
есть еще один способ закрытия-перезапуск приложения:
сохраните запланированную задачу на короткое время после закрытия приложения. Это должно быть ПОСЛЕДНИЙ вещь, которую ваше приложение делает перед выходом (без дальнейшей обработки данных, сохранения, загрузки или чего-либо еще)
например.
- сначала получите системное время
- установите запланированную задачу через некоторое время после этого времени (запланированное событие должно будет начать исполняемый файл)
- выход из приложения (закрытие основной формы или приложения.terminate сделает это)
когда ваша программа запускается снова, она должна проверить наличие любой такой запланированной задачи и удалить их. Это должно быть ПЕРВЫЙ действие ваше приложение должно делать при запуске. (очистка)
- проверьте наличие запланированных задач, созданных исполняемым файлом
- удалить их
АФАИК, Дельфийский джедай в наборе компонентов есть компонент, с помощью которого можно выполнять планирование задач.
Я могу добавить к @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;