我有一个小应用程序,大部分时间都有一个应该从命令行参数/ AUTORUN触发的开始按钮后面的动作。 如果缺少该参数,用户也可以手动按下它。
我的问题是我应该在哪里对命令行进行此检查,因此在给出GUI时仍然会更新。目前的解决方案就是这样,但在动作完成之前不会更新GUI。
procedure TfrmMainForm.FormShow(Sender: TObject);
begin
if FindCmdLineSwitch('AUTORUN') then
btnStart.Click;
end;
答案 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;
并且间隔几千毫秒。