Каков наилучший способ автоматического запуска действия после события 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;
И интервал в несколько тысяч миллисекунд.