OnShow事件后自动启动操作的最佳方法是什么?

Rol*_*son 13 delphi delphi-2007

我有一个小应用程序,大多数时候在Start-button后面有一个动作,应该从命令行参数/ AUTORUN触发.如果缺少该参数,用户也可以手动按下该参数.

我的问题是我应该在哪里对命令行进行此检查,以便在给出GUI时仍然更新.目前的解决方案是这样,但在动作完成之前不会更新GUI.

procedure TfrmMainForm.FormShow(Sender: TObject);
begin
  if FindCmdLineSwitch('AUTORUN') then
    btnStart.Click;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 20

从您的OnShow事件处理程序发布自己的消息.一旦应用程序开始为其消息队列提供服务,就会立即处理此问题.只有在应用程序准备好接收输入时才会发生这种情况.这符合您对我的要求的理解.

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;
Run Code Online (Sandbox Code Playgroud)

添加消息处理程序来处理消息:

procedure WMStartup(var Msg: TMessage); message WM_STARTUP;
Run Code Online (Sandbox Code Playgroud)

你可以像这样实现:

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


Kei*_*ler 5

在FormShow中向自己发布消息。在消息处理程序中,运行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;
Run Code Online (Sandbox Code Playgroud)