What is the best way to autostart an action after OnShow event?

前端 未结 3 1348
梦毁少年i
梦毁少年i 2020-12-15 23:14

I have a small application that most of the time have an action behind a Start-button that should be triggered from the commandline parameter /AUTORUN. If that parameter is

相关标签:
3条回答
  • 2020-12-15 23:43

    In the FormShow post yourself a message. In the message handler run your 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;
    
    0 讨论(0)
  • 2020-12-15 23:59

    An easy way would be a timer, with an event like this:

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

    And an interval of a few thousand milliseconds.

    0 讨论(0)
  • 2020-12-16 00:00

    Post yourself a message from your OnShow event handler. This will be processed as soon as your application starts servicing its message queue. That only happens when the application is ready to receive input. Which matches your my understanding of your requirements.

    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;
    

    Add a message handler to deal with the message:

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

    You'd implement that like this:

    procedure TfrmMainForm.WMStartup(var Msg: TMessage);
    begin
      inherited;
      if FindCmdLineSwitch('AUTORUN') then
        btnStart.Click;
    end;
    
    0 讨论(0)
提交回复
热议问题