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)
最简单的方法是使用计时器.
让您在设计时创建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
如果您的应用程序在创建期间执行某些连续操作.
归档时间: |
|
查看次数: |
508 次 |
最近记录: |