关闭并重新启动DELPHI中的当前应用程序

时间:2011-05-16 17:11:27

标签: delphi restart

我该怎么做?

由于某种原因或用户选择,“询问”当前应用程序是否自行重启。

4 个答案:

答案 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)

关闭 - 重新启动应用程序还有另一种方法:

在应用程序关闭后的短时间内保存计划任务。这必须是您的应用程序在退出之前执行的非常的事情(无需进一步的数据处理,保存,上传等)

例如。

  1. 首先获得系统时间
  2. 在此时间之后设置计划任务一段时间(计划事件必须启动可执行文件)
  3. 退出您的应用程序(关闭主窗体或application.terminate将执行此操作)
  4. 当您的程序再次启动时,它应检查任何此类计划任务并将其删除。这必须是您的应用程序在启动时应执行的非常第一操作。 (清理)

    1. 检查您的可执行文件创建的任何计划任务
    2. 删除它们
    3. 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;