首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在DELPHI中关闭并重新启动当前应用程序

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

Stack Overflow用户
提问于 2011-05-17 01:11:27
回答 3查看 23.7K关注 0票数 20

我该怎么做呢?

出于某种原因或由用户选择,“要求”当前应用程序自行重新启动它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-17 01:14:12

代码语言:javascript
复制
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;
票数 33
EN

Stack Overflow用户

发布于 2014-11-06 02:53:46

我可以添加到@Andreas Rejbrand的答案中:

如果代码在Application.Initialize.之前在.dpr文件中执行,对于我来说,最好调用Halt(0)而不是Application.Terminate。我需要它,因为在第一次启动时,程序会执行一些安装,然后重新启动。如果我调用Application.Terminate,main form会闪烁几秒钟(但根本不应该创建它!)然后应用程序关闭。所以我的代码如下:

project.dpr:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2011-05-17 16:03:27

您可以有一个单独的简单restart.exe程序,它从您的程序中运行,并将可执行文件的名称传递给它。然后关闭你的程序。重新启动程序可以等待一段时间,或者直到可执行文件是可读写的(这似乎意味着它没有运行),然后它可以执行它并关闭它自己。

我希望有一种更好的方法来做到这一点,也许有人可以提供更好的解决方案,但这个函数似乎告诉我当前是否正在运行可执行文件:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6020867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档