14

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

我的问题是我应该在哪里放置这个命令行检查,这样当它被给定时,GUI 仍然会更新。当前的解决方案是这样,但在操作完成之前不会更新 GUI。

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

3 回答 3

22

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;
于 2013-01-14T13:20:53.057 回答
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;
于 2013-01-14T13:22:47.293 回答
-2

一种简单的方法是使用计时器,其事件如下:

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

以及几千毫秒的间隔。

于 2013-01-14T12:58:40.780 回答