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 に答える