Каков наилучший способ автоматического запуска действия после события OnShow?

У меня есть небольшое приложение, которое большую часть времени выполняет действие за кнопкой "Пуск", которая должна запускаться из параметра командной строки /AUTORUN. Если этот параметр отсутствует, пользователь может также нажать его вручную.

Мой вопрос в том, где я должен поместить эту проверку для командной строки, поэтому, когда она предоставляется, графический интерфейс все еще обновляется. Текущее решение - это, но GUI не обновляется до завершения действия.

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

Ответ 1

Отправьте сообщение от своего обработчика событий 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;

Ответ 2

В 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;

Ответ 3

Легким способом будет таймер с таким событием:

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

И интервал в несколько тысяч миллисекунд.