在Delphi中延迟执行

jsm*_*ith 4 delphi delayed-execution

调用程序结束后是否可以延迟启动程序?

procedure StartLoop;
begin
  DoSomething;
end;

procedure FormCreate(...);
begin
  if ParamStr(1)='start' then StartLoop;
end;
Run Code Online (Sandbox Code Playgroud)

StartLoop将被称为 FORMCREATE,和FORMCREATE将等待,并阻止进一步的执行不仅FORMCREATE本身的,而且之后(FormShow等)执行进一步的程序,并形成将不会显示,直到StartLoop将结束.

我需要等到FormCreate结束,然后运行StartLoop(不使用线程).

Rem*_*eau 11

如果您使用10.2东京或更晚,您可以使用TThread.ForceQueue():

procedure TMyForm.FormCreate(Sender: TObject);
begin
  if ParamStr(1) = 'start' then
    TThread.ForceQueue(nil, StartLoop);
end;
Run Code Online (Sandbox Code Playgroud)

否则,你可以使用PostMessage():

const
  WM_STARTLOOP = WM_USER + 1;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  if ParamStr(1) = 'start' then
    PostMessage(Handle, WM_STARTLOOP, 0, 0);
end;

procedure TMyForm.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_STARTLOOP then
    StartLoop
  else
    inherited;
end;
Run Code Online (Sandbox Code Playgroud)


MBo*_*MBo 7

最简单的方法是使用计时器.

让您在设计时创建DelayTimer所需的句点集并Enabled = False在表单上创建(您也可以动态创建它).为它分配事件处理程序:

  procedure TFormXX.DelayTimerTimer(Sender: TObject);
  begin
     DelayTimer.Enabled := False;   // works only once
     StartLoop;
  end;
Run Code Online (Sandbox Code Playgroud)

在表单初始化例程启动此计时器:

 procedure FormCreate(...);
 begin
   if ParamStr(1)='start' then  
       DelayTimer.Enabled := True; 
 end;
Run Code Online (Sandbox Code Playgroud)

也许您想稍后启动计时器,例如 - OnShow如果您的应用程序在创建期间执行某些连续操作.