No exemplo anterior foi devidamente explicado como retroceder valores de tempo(hh:mm:ss), utilizando apenas cálculo numerico. Essa abordagem não leva em conta que até mesmo pra fazer esses cálculos o processador pode dispender tempo(ínfimo), acarretando pequeníssimos desvios.

Vamos agora abordar a solução usando uma outra técnica, mais apurada,sem fazer uso de componentes TTimer.

Desenvolva a seguinte função:

function TfrmPrincipal.GerarTimer(Tipo: Integer; Data:TTime): String;
var
  iData1, iData2: String;
begin
  {:Tipo = 0 -> Regressivo   Tipo = 1 -> Progressivo}

  iData1 := TimeToStr(Data);

  if (Tipo = 0) then
    iData2 := TimeToStr((StrToTime(iData1) - StrToTime('00:00:01')))
  else
    if Tipo = 1 then iData2 := TimeToStr((StrToTime(iData1) + StrToTime('00:00:01')));

  iData1 := iData2;
  Result := iData1;
end;


Agora coloque no seu formulário um componente TMaskEdit(txtTempo: EditMask = '!00:00:00;1;_')
e um TButton(btnGerarContagem: Caption = 'Iniciar Processo'), e no evento OnClick deste, digite:

  {:Para processo regressivo - informamos o tempo final como '00:00:00'
     Informe então um valor em txtTempo.text(valor de sua escollha, ex: '00:10:15') quando rodar a aplicação)

  while (txtTempo.Text <> '00:00:00') do
    begin
      txtTempo.Text := GerarTimer(0, StrToTime(txtTempo.Text));
      Sleep(1000);
      Application.ProcessMessages;
    end;


Para processo progressivo basta agora colocar o valor de tempo futuro onde o processo terminará,não esquecendo de usar o parâmetro 1 em Tipo:

{:Para processo progressivo - informamos o tempo final(valor de sua escollha, ex: '00:10:15')
   quando rodar a aplicação - veja abaixo)

  while (txtTempo.Text <> '00:10:15') do
    begin
      txtTempo.Text := GerarTimer(1, StrToTime(txtTempo.Text));
      Sleep(1000);
      Application.ProcessMessages;
    end;


Espero ter ajudado e até a próxima. Compartilhar é também ganhar...