我该怎么做?
由于某种原因或用户选择,“询问”当前应用程序是否自行重启。
答案 0 :(得分:27)
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)
关闭 - 重新启动应用程序还有另一种方法:
在应用程序关闭后的短时间内保存计划任务。这必须是您的应用程序在退出之前执行的非常的事情(无需进一步的数据处理,保存,上传等)
例如。
当您的程序再次启动时,它应检查任何此类计划任务并将其删除。这必须是您的应用程序在启动时应执行的非常第一操作。 (清理)
AFAIK,Delphi Jedi组件集有一个组件,你可以用它来完成任务调度。
答案 2 :(得分:2)
我可以添加到@Andreas Rejbrand回答:
如果代码是在Application.Initialize.
之前的.dpr文件中执行的,那么最好拨打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;
答案 3 :(得分:1)
您可以从程序运行一个单独的简单restart.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;