What is the best way to autostart an action after OnShow event?

房东的猫 提交于 2019-11-30 08:37:42

Post yourself a message from your OnShow event handler. This will be processed as soon as your application starts servicing its message queue. That only happens when the application is ready to receive input. Which matches your my understanding of your requirements.

const
  WM_STARTUP = WM_USER;
....
procedure TfrmMainForm.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_STARTUP, 0, 0);
  OnShow := nil;//only ever post the message once
end;

Add a message handler to deal with the message:

procedure WMStartup(var Msg: TMessage); message WM_STARTUP;

You'd implement that like this:

procedure TfrmMainForm.WMStartup(var Msg: TMessage);
begin
  inherited;
  if FindCmdLineSwitch('AUTORUN') then
    btnStart.Click;
end;

In the FormShow post yourself a message. In the message handler run your btnStart.

TfrmMainForm = class(TForm)
// snip
private
  procedure AutoStart(var Message: TMessage); message wm_user;
// snip
end

procedure TfrmMainForm.FormShow(Sender: TObject);
begin
  if FindCmdLineSwitch('AUTORUN') then
    PostMessage(Handle, wm_user, 0, 0);
end;

procedure TfrmMainForm.AutoStart(var Message: TMessage);
begin
  btnStart.Click;
end;

An easy way would be a timer, with an event like this:

begin
  Timer1.Enabled := False;
  if FindCmdLineSwitch('AUTORUN') then
    btnStart.Click;
end;

And an interval of a few thousand milliseconds.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!