Como somar valores do tipo TTime??

Delphi

09/02/2009

Olá pessoal. Como eu faço para somar 2 valores do tipo TTIme.
Aqui neste link tem a imagem de como o meu programa deve ficar:

http://i415.photobucket.com/albums/pp240/junniorsouzza/imagem.jpg

Eu declarei uma variavel Chamada TotalHoras : TTime; Eu quero ir digitando uma quantidade de tempo nos campos da coluna Horas deste DBGrid (olhem a figura) e ir automaticamente somando esses valores na variável TotalHoras e imprimir a soma num Edit do formulário. Só que eu não sei como fazer para somar valores do tipo time. Não estou usando banco de dados, então por favor não respondam nada que esteja relacionado com banco de dados. ^^

Vlw!!


Junnsouzza

Junnsouzza

Curtidas 0

Respostas

Sebastiaoarm

Sebastiaoarm

09/02/2009

Basta somar normalmente, não?

function SomaTTime(Horas: array of TTime): TTime;
var
  i: Integer;
begin
  for i := 0 to (Length(Horas) - 1) do Result := Result + Horas[i];
end;


Um exemplo de uso:

begin
  ShowMessage(TimeToStr(SomaTTime([StrToTime(´00:15:00´), StrToTime(´01:30:00´)])));
end;



GOSTEI 0
Junnsouzza

Junnsouzza

09/02/2009

Mas isso funciona se a soma exceder 23:59 ???
Por exemplo. Se a soma de horas trabalhadas por um funcionário na semana der 40 horas e 30 minutos. O resultado da soma vai dar 40:30???


GOSTEI 0
Sebastiaoarm

Sebastiaoarm

09/02/2009

Não, não funciona.

Creio que essa função faça o que você procura:

function SomaTTime(Tempos: array of TTime): String;
var
  i,
  Horas,
  Minutos,
  Segundos: Integer;
begin
  Horas := 0;
  Minutos := 0;
  Segundos := 0;
  for i := 0 to (Length(Tempos) - 1) do
  begin
    Horas := Horas + HourOf(Tempos[i]);
    Minutos := Minutos + MinuteOf(Tempos[i]);
    Segundos := Segundos + SecondOf(Tempos[i]);
  end;
  Segundos := Segundos + (Minutos * 60) + (Horas * 3600);
  Horas := Segundos div 3600;
  Minutos := Segundos div 60 - (Horas * 60);
  Segundos := Segundos - (Minutos * 60) - (Horas * 3600);
  Result := Format(´¬.2d:¬.2d:¬.2d´, [Horas, Minutos, Segundos]);
end;


Exemplo de uso:

procedure Testa;
begin
  ShowMessage(SomaTTime([StrToTime(´23:59:00´), StrToTime(´16:31:0´)]));
end;


Certo?


GOSTEI 0
Junnsouzza

Junnsouzza

09/02/2009

Ok ok. Funcionou direitinho.
Obrigado!!

Tópico encerrado!!


GOSTEI 0
Josue Rosa

Josue Rosa

09/02/2009

Boa tarde,

Como fazer funcionar essa Function dentro de um laço While, onde tenho horários dentro de um periodo exemplo 01/07/2020 a 31/07/2020.

Tentei fazer dessa forma:

procedure TfrmPrincipal.BtnCalcularClick(Sender: TObject);
var
TOTAL, TOTAL_DIARIO : String;
begin
if dmdados.FDQTOTAL_APURACAO.RecordCount <> 0 then
begin
dmdados.FDQTOTAL_APURACAO.Delete;
dmdados.FDConnection.Commit;
DMDados.FDQTOTAL_APURACAO.refresh;
end;
//fazer a soma total das horas normais
dmdados.FDQHorarios.first;
while not dmdados.FDQHorarios.Eof do
begin
TOTAL_DIARIO:=TimeToStr(dmdados.FDQHorariosTOTAL_DIARIO.Value);
dmdados.FDQHorarios.Next;
total:= SomaTTime([StrToTime(TOTAL_DIARIO)]);

end;
dmdados.FDQTOTAL_APURACAO.edit;
dmdados.FDQTOTAL_APURACAOTOTAL_HORAS_NORMAIS.Value:=StrtoTime(total);
dmdados.FDQTOTAL_APURACAOCOD_PERIODO.Value:=dmdados.FDQHorariosCOD_PERIODO.Value;
dmdados.FDQTOTAL_APURACAO.Post;
end;
GOSTEI 0
POSTAR