PDA

Ver la Versión Completa : No me gusta este Codigo, Me ayudan?!


marceloalegre
27-10-2005, 16:55:41
Buen dia:
Estoy haciendo un programita en el que cuento tiempo en un cliente, el tema es que estoy contando el tiempo convirtiendo segundos con un formatdatetime pero eso me di cuenta que al llegar a las 24hs se vuelve a cero, logico porque sumaria 1 dia, pero tengo que mostrar solo horas, o sea si esta logueado 25 hs me muestre 25:00:00... por lo tanto genere el siguiente algoritmo:


function formateartiempo(tpo : integer): string;
var aux : string;
begin
aux := IntToStr(tpo);
if length(aux) = 1 then
aux := '0' + aux;
result := aux;
end;
function ConvertirTiempo(totalSeg : integer): string;
var
horas, minutos, segundos : word;
begin
horas :=totalseg div (3600);
totalseg := totalseg mod (3600);
minutos := totalseg div (60);
segundos := totalseg mod (60);
result := formateartiempo(horas) + TimeSeparator +
formateartiempo(minutos) + TimeSeparator + formateartiempo(segundos);
end;

(el timeseparator es un char que tiene : :))

Bueno, esto anda perfercto, pero me gusta ser prolijo y aprender mas,, alguien me puede decir como mejorar esto.. me parece muy fea la funcion formateartiempo para empezar... me pueden dar una mano? gracias.!

luisgutierrezb
27-10-2005, 18:47:38
mmm podrias utilizar la funcion de la api de windows GetTickCount, te dice el numero de milisegundos o segundos (no recuerdo) que el windows lleva activo, podrias hacer algo asi:
Inicio := GetTickCount;
y al final lo vuelves a obtener para sacar la diferencia y conviertes el resultado a minutos, horas o lo que desees.

la otra es que al restar 2 variables FechaHora, te regresa la diferencia
la parte entera te dice cuantos dias fueron, y la parte decimal la conviertes normal a hora, minutos y demas, y transformas a lo que tu quieres...

maeyanes
27-10-2005, 18:53:13
Una variación a tu función formateartiempo:


function formateartiempo(tpo : integer): string;
begin
result := Format('%.2d', [tpo])
end;



Saludos...

Lepe
28-10-2005, 00:23:52
Directamente trabaja con las rutinas que tienes en la unidad DateUtils de Delphi.

Al menos en delphi 6 tienes:

HoursBetween(AThen, ANow:TdateTime);
SecondsBetween(AThen, ANow:TdateTime);
MinutesBetween(AThen, ANow:TdateTime);
MillisecondsBetween(AThen, ANow:TdateTime);
DaysBetween(AThen, ANow:TdateTime);

y un largo etc.

Básicamente lo pasas todo a segundos o milisegundos, algo así:

function HorasEntre(Antes, Ahora:TdateTime):string;
var totalSeg:Dword;
begin
totalSeg := secondsBetween(antes,ahora);
result := format ('%d : %d :%d',
[totalseg div (3600),
totalseg div (60),
totalseg mod (60)]);
end;

He separado el carácter 2 puntos, porque creo recordar que interfiere con la función format, ya sería cosa de mirarlo con más detalle.

Consejo: Nunca trabajes con Times, siempre con TdateTime, (por lo que comentas del cambio de fecha).

saludos

Julià T.
28-10-2005, 01:03:54
sólo una pequeña corrección al código para tiempos mayores de 3600 segundos

function HorasEntre(Antes, Ahora:TdateTime):string;
var totalSeg:Dword;
begin
totalSeg := secondsBetween(antes,ahora);
result := format ('%d : %d :%d',
[totalseg div (3600),
(totalseg div (60)) mod 60, //no lo he probado
totalseg mod (60)]);
end;

marceloalegre
28-10-2005, 01:27:27
Bueno, podemos decir que ha quedado todo correcto con la ayuda de ustedes. Gracias a todos!!!!