Criando um Timer de Tempo Regressivo

Desenvolvendo um exemplo onde podemos informar uma determinada hora, e fazer com que essa hora seja diminuída segundo a segundo.

Toda vez que trabalhamos com Datas diversas situações podem ocorrer, como achar a diferença  de  dias  entre  datas  informadas, aumentar uma determinada data em dias, situações com o ano bissexto e diversas outras.

Mas existem situações onde precisamos fazer uma determinada hora retroceder segundo a segundo.
Isso ocorre em sistemas onde se  informa um valor de tempo(hora:minuto:segundo) específico para o usuário e o mesmo verá em seu monitor um retrocesso segundo a segundo ,chegando ao fim do processo com o valor(00:00:00).

Para se fazer isso é preciso ter em mente que o tipo TDateTime,  que  representa valores para datas são internamente tratadas como números reais. O que ocorre é um mapeamento interno, onde uma data é um número(tipo primitivo)  e com ele qualquer operação inerente ao mesmo pode ser  feita normalmente.  Por  convenção o número  1( UM ) corresponde a 31/12/1899 12:00:00, essa data representa  o início dessa contagem.

Para se fazer uma contagem segundo a segundo temos que saber qual é o valor numérico correspondente a 1 segundo e fazer uma subtração da hora inicial informada deste valor, de forma continua até chegarmos ao valor de 00:00:00.

Logo: 1 dia corresponde a uma unidade, como um dia têm 86400 segundos(24x60x60), conclui-se  que 1 segundo corresponde a  1/86400 de um dia, equivalente a 0,0000115740740740740740740740740741  que pode ser aproximado para 0.0000115741.

Vamos então desenvolver uma função para efetuar esse processo:

function TfrmPrincipal.GerarTimer(Data: TDateTime):  String;
var
  iData1, iData2:  String;
begin
  iData1 := TimeToStr(Data);
  iData2 := TimeToStr( (StrToTime(iData1) - 0.0000115741) );
  iData1 := iData2;

  Result := iData1;
end;

Coloque um componente Timer(TimerRetroceder - interval = 1000), e um MaskEdit(txtTempoInicial) em seu Formulário e no evento OnTimer digite:

  if (txtTempoInicial.Text <>'00:00:00') then

       txtTempoInicial.Text  :=  GerarTimer(StrToTime(txtTempoInicial.Text));

 Depois é so ativar o componente Timer : TimerRetroceder.Enabled := True;

Pronto! Espero ter sido útil e até a próxima.

Artigos relacionados