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

时间:2013-01-14 12:54:12

标签: delphi delphi-2007

我有一个小应用程序,大部分时间都有一个应该从命令行参数/ AUTORUN触发的开始按钮后面的动作。 如果缺少该参数,用户也可以手动按下它。

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

procedure TfrmMainForm.FormShow(Sender: TObject);
begin
  if FindCmdLineSwitch('AUTORUN') then
    btnStart.Click;
end;

3 个答案:

答案 0 :(得分: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;

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

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

你可以这样实现:

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

答案 1 :(得分: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;

答案 2 :(得分:-3)

一个简单的方法是一个计时器,有这样的事件:

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

并且间隔几千毫秒。