2013-01-14 8 views
10

Ho una piccola applicazione che la maggior parte delle volte ha un'azione dietro un pulsante di avvio che dovrebbe essere attivata dal parametro della riga di comando/AUTORUN. Se questo parametro manca, l'utente potrebbe anche premerlo manualmente.Qual è il modo migliore per avviare automaticamente un'azione dopo l'evento OnShow?

La mia domanda è dove dovrei posizionare questo controllo per la riga di comando così quando viene fornita la GUI è ancora aggiornata. La soluzione corrente è questa, ma la GUI non viene aggiornata fino al termine dell'azione.

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

risposta

15

Posta un messaggio dal gestore di eventi OnShow. Questo verrà elaborato non appena l'applicazione inizia a servire la coda dei messaggi. Ciò accade solo quando l'applicazione è pronta per ricevere input. Che corrisponde alla tua comprensione delle tue esigenze.

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; 

Aggiungere un gestore di messaggi a che fare con il messaggio:

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

Faresti implementare che in questo modo:

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

Sembra funzionare bene. Grazie! –

+0

Cosa fa "inherited;" in questo gestore di messaggi? – user1580348

+0

Esegue qualsiasi gestione dei messaggi predefinita o qualsiasi cosa implementata nelle classi padre. In questo caso c'è probabilmente un piccolo punto perché è un messaggio definito dall'utente. Tuttavia, generalmente lo scrivo come una buona pratica per i gestori di messaggi. –

-3

Un modo semplice sarebbe un timer, con un evento come questo:

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

E un intervallo di poche migliaia di millisecondi.

+0

Non utilizzare un timer per questo. Inserisci invece un messaggio nel modulo che causa l'esecuzione di btnStart. –

+0

@KeithMiller Sono perso quando si tratta di messaggi. Forse potresti postarlo come un'altra risposta? –

+1

Non farlo. Ora perdi il controllo su quando la cosa scorre. –

3

Nel FormShow inviare voi stessi un messaggio. Nel gestore del messaggio esegui il tuo 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; 
Problemi correlati