Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como armar una fecha sin error (https://www.clubdelphi.com/foros/showthread.php?t=73503)

oscarac 27-04-2011 06:31:00

Como armar una fecha sin error
 
Buenas noches
quiza no se entienda bien el titulo pero quiero hacer lo siguiente

Tengo esta Variable

wf_VCH : TDateTime;

luego tengo un edit donde coloco solo el dia y quisiera generar la fecha
estoy haciendo algo mas o menos como esto

Código Delphi [-]
 
wf_vch := EncodeDate(StrToInt(Copy(dmGlobal.g_Periodo,1,4)), strtoint (dmGlobal.g_Mes),  strtoint(edtDia.Text));

El Year lo tengo controlado, el mes tambien, pero en el caso del dia... el usuario podria colocar cualquier dato y me gustaria que sea validado

ejemplo
podria ser
32/12/2009... me genera in mensaje de error que dice

Cita:

Invalid argument to date encode
alguien tiene alguna idea?

gracias

oscarac 27-04-2011 07:12:30

Lo solucione de esta manera

espero q a alguien le sirva

Código Delphi [-]
 Try
  wf_vch := EncodeDate(StrToInt(Copy(dmGlobal.g_Periodo,1,4)), strtoint (dmGlobal.g_Mes),  strtoint(edtDia.Text));
  except
    On EConvertError Do edtDia.SetFocus
  End;

duilioisola 27-04-2011 22:10:13

La solución es correcta. Lo que quizás no sea tan correcto es el uso de excepciones para tratar un error previsible.

El uso de excepciones carga mucho al programa, destruye el flujo normal del código y puede hacer que el código no sea fácilmente legible.

En el caso que nos ocupa, sería preferible hacer una simple comprobación y con un IF decidir si es correcto o no.

Código Delphi [-]
   // Compruebo que el edit tenga un numero
   if (StrToIntDef(dmGlobal.g_Mes), 0) > 0) then
   begin
      // Primero compruebo que el mes sea correcto
      if (StrToInt(dmGlobal.g_Mes) <= 12) then
      begin
         // Luego compruebo que el día sea menor que la cantidad de días en el mes
         if (DaysInMonth(StrToInt(Copy(dmGlobal.g_Periodo,1,4)), StrToInt(dmGlobal.g_Mes)) >= StrToInt(edtDia.Text)) then
            wf_vch := EncodeDate(StrToInt(Copy(dmGlobal.g_Periodo,1,4)), StrToInt(dmGlobal.g_Mes),  strtoint(edtDia.Text))
         else
            edtDia.SetFocus;
      end;
   end;

Y para ahorrarnos todo este trabajo, existe la función TryEncodeDate que nos devuelve en su último parámetro la fecha y verdadero o false si se pudo convertir correctamente.


La franja horaria es GMT +2. Ahora son las 14:42:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi