Asunto: Problema al comparar dos horas TTime en Delphi
Estoy ejecutando el siguiente código:
Código:
if (opProLunes.Checked) and (DayOfTheWeek(Now) = 1) and
(TimeOf (now) = StrToTime(txtProHoraLunes.Text)) then
begin
actIniciarCopiaExecute(Self);
...
end;
donde "txtProHoraLunes" es un componente visual de tipo TMaskEdit, por ello convierto el texto introducido a Time, para poder compararlo con el resultado de la función TimeOf.
El caso es que nunca se cumple la condición de igualdad entre las horas, es decir, ni poniendo las mismas horas (hora actual y hora introducida por el usuario) funciona esta comparación.
La máscara que utilizo en el TMaskEdit en la propiedad EditMask es: "!90:00;1;_".
¿cómo puedo comparar dos horas correctamente? ¿qué estoy haciendo mal?
Publicado:
Mar Sep 04, 2007 6:11 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Problema al comparar dos horas TTime en Delphi
Anuncios
varios escribió:
Estoy ejecutando el siguiente código:
...
comparar dos horas correctamente? ¿qué estoy haciendo mal?
Por lo que vemos, en el TEditMask introduces sólo Horas y minutos, mientras que en la comparación que realizas, al tratarse del tipo de datos TTime, estás comparando Horas, minutos, segundos y milisegundos. Con lo cual es muy probable que nunca te funcione, pues la hora que conviertes con StrToTime no lleva ni segundos ni milisegundos. Para solucionar esto, puedes utilizar esta función, que te comparará dos horas y, además, podrás indicarle qué componentes de la hora quieres utilizar para la comparación (minutos, segundos, milisegundos):
Código:
function comprobarHoraIgual (hora1 : TTime; hora2 : TTime;
compMilisegundos : boolean; compSegundos : boolean;
compMinutos : boolean) : boolean;
var
horas, minutos, segundos, milisegundos : Word;
horasPro, minutosPro, segundosPro, milisegundosPro : Word;
iguales : boolean;
begin
DecodeTime(hora1, horas, minutos,
segundos, milisegundos);
DecodeTime(hora2, horasPro, minutosPro,
segundosPro, milisegundosPro);
iguales := horas = horasPro;
if iguales and compMinutos then
begin
iguales := minutos = minutosPro;
if iguales and compSegundos then
begin
iguales := segundos = segundosPro;
if iguales and compMilisegundos then
iguales := milisegundos = milisegundosPro;
end;
end;
Result := iguales;
end;
Tu código quedaría de la siguiente forma:
Código:
if (opProLunes.Checked) and (DayOfTheWeek(Now) = 1) and
(comprobarHoraIgual (TimeOf (now),
StrToTime(txtProHoraLunes.Text),
false, false, true)) then
begin
actIniciarCopiaExecute(Self);
...
end;
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A