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.