quinta-feira, 2 de abril de 2009

Como desabilitar um TTimer com eficiência

Não sei você, mas eu não gosto de trabalhar com TTimer...

E um lance capital é quando você precisa desabilitar a execução de um Timer para que não conflita com uma determinada rotina.

É fato é que é um bom hábito desabilitar o Timer no inicio de sua execução, habilitando-o no fim, como no exemplo abaixo:

proceure Form1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
//...
//...
Timer1.Enabled := True;
end;


Isso evita encavalamento, caso dê o tempo de executar de novo antes de se finalizar o procedimento.

Se em outro ponto você precisar desabilitar esse Timer, sua primeira opção seria:

//...
Timer1.Enabled := False;
//...


Mas veja que interessante: Você não sabe se o Timer está em andamento e também não se deu conta que a última linha do Timer irá habilitar o Timer novamente.

Depois de anos convivendo com isso, tive uma sacada legal:

//...
Timer1.OnTimer := nil; //Assim nada será executado...
while not Timer1.Enabled do
Application.ProcessMessages; //Isso indica que o Timer está em excução
Timer1.Enabled := False; 
//...
//...
Timer1.OnTimer := Timer1Timer; //Aqui devolvemos o evento
Timer1.Enabled := True; //Aqui religamos o Timer
//...

Minha lista de blogs