2013-01-14 12 views
10

Mam małą aplikację, która przez większość czasu ma działanie za przyciskiem Start, które powinno zostać wywołane z parametru linii poleceń/AUTORUN. Jeśli tego parametru brakuje, użytkownik może również nacisnąć go ręcznie.Jaki jest najlepszy sposób na autostartowanie akcji po zdarzeniu OnShow?

Moje pytanie brzmi: gdzie powinienem umieścić to zaznaczenie dla linii poleceń, więc gdy zostanie podany, GUI jest ciągle aktualizowany. Obecne rozwiązanie jest takie, ale GUI nie jest aktualizowane, dopóki działanie nie zostanie zakończone.

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

Odpowiedz

15

Zamieść wiadomość od swojej obsługi zdarzeń OnShow. Zostanie to przetworzone, gdy tylko aplikacja zacznie obsługiwać kolejkę komunikatów. Dzieje się tak tylko wtedy, gdy aplikacja jest gotowa do odbioru danych wejściowych. Co pasuje do mojego zrozumienia Twoich wymagań.

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; 

Dodawanie obsługi wiadomość do czynienia z komunikatem:

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

Można by realizować to tak:

procedure TfrmMainForm.WMStartup(var Msg: TMessage); 
begin 
    inherited; 
    if FindCmdLineSwitch('AUTORUN') then 
    btnStart.Click; 
end; 
+0

Wydaje się działać świetnie. Dzięki! –

+0

Co znaczy "dziedziczone" w tym programie obsługi komunikatów? – user1580348

+0

Wykonuje domyślną obsługę komunikatów lub cokolwiek zaimplementowanego w klasach nadrzędnych. W tym przypadku prawdopodobnie nie ma sensu, ponieważ jest to komunikat zdefiniowany przez użytkownika. Jednak generalnie piszę to jako dobrą praktykę dla obsługi wiadomości. –

-3

Łatwym sposobem byłoby timer, ze zdarzeniem tak:

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

i interwał kilku tysięcy milisekund.

+0

Nie używaj do tego timera. Zamiast tego wyślij wiadomość do formularza, który spowoduje uruchomienie btnStart. –

+0

@KeithMiller Jestem zagubiony, jeśli chodzi o wiadomości. Być może mógłbyś opublikować to jako kolejną odpowiedź? –

+1

Nie rób tego. Teraz tracisz kontrolę nad tym, kiedy coś działa. –

3

W FormShow pisać do siebie wiadomość. W obsłudze komunikatów uruchom twój 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; 
Powiązane problemy