Ir al contenido


Foto

Validar fecha componente TLSDateEdit


  • Por favor identifícate para responder
5 respuestas en este tema

#1 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 08 febrero 2015 - 08:25

Hola amigos del foro estoy desarrollando un sistema con lazarus y necesito validar que el usuario no deje con una fecha invalidad el TLSDateEdit. Es la primera vez que estoy trabajando con este componente y no se como puedo realizar esta validación. Espero me puedan ayudar de antemano muchas gracias.

Archivos adjuntos


  • 0

#2 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 09 febrero 2015 - 05:55

¿Qué biblioteca El Chava?, no encuentro ese control.
Aun así, la validación se puede hacer luego del ingreso como cualquier otra mediante el evento OnExit. Esos controles normalmente evitan la introducción de caracteres no válidos.
Lo más sencillo es utilizar un control como el que se ve a la derecha, algo como un DBCalendar, en el cual no se puede cometer errores ya que todos los días son válidos y seleccionables.

Saludos

  • 0

#3 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 09 febrero 2015 - 10:21

Hola cram. Ese componente lo instale se llama LazSolutions y lo que me llama la atención de este compoente este cuenta con propiedades como ValidationType y evento como OnValidate solo que no he encontrado documentación que me ayude a resolver ese problema. Trate de hacer la validación en el evento OnExit pero lo que ocasionaba es que borraba todo el contenido de la propiedad text del componente.

Archivos adjuntos


  • 0

#4 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 10 febrero 2015 - 12:20

Es precisamente en el evento OnValidate, donde debes hacer la validación. No significa que la validación sea automática, sino que puedes controlarla.

Primero, deberías prohibir la introducción de cualquier caracter extraño, es decir solo números y la barra de separación.

StrToDate valida la cadena a convertir, podrías utilizar esta función en OnValidate dentro de una estructura Try.
Por ejemplo except Result:= False.

La rutina que sigue no fue probada (la escribí solo en papel), pero puede funcionar, te dejo el resto de trabajo (prueba).



delphi
  1. function EsFechaValida(D, M, A: Integer): Boolean;
  2. // D, M, A son día, mes y año. Se supone que deberías separarlos antes.
  3. var
  4.   Max: Integer;
  5. begin
  6.   Result:= False;
  7.   if A<0 then Exit;
  8.   if (M<1) or (M>12) then Exit;
  9. if M = 2
  10.   then if (A mod 4) = 0
  11.     then Max:= 28
  12.     else Max:= 29
  13.   else if (M<7)
  14.     then Max:= 30 + (M mod 2)
  15.     else Max:= 30 + ((M+1) mod 2)
  16.   Result:= (D>0) and (D < Max);
  17. end;



En teoría cada 100 bisiestos un año no lo es, pero eso fue para el 2000 y aun así fue bisiesto. ¿?  :|

Saludos

  • 0

#5 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 10 febrero 2015 - 08:23

Hola Cram gracias por tu respuesta. Te comento que tratando de resolver el problema decide usar el componente que trae por defecto lazarus que es el TDateEdit. Este el código que uso para poder validar que el usuario ha introducido una fecha valida.



delphi
  1. var
  2. MyDateTimeVar: TDateTime;
  3. begin
  4.   try
  5.   MyDateTimeVar:= StrToDate(fechaentrega.Text);
  6.   except
  7.     on EConvertError do begin
  8.       Application.MessageBox('La fecha de entrega no es validad, favor de verificar','Error',mb_iconstop);
  9.     end;
  10.   end;   
  11. end;



Pero solo en ocasiones detecta el error. Le adjunto unas imágenes donde en una si me detecta el error por ejemplo si solo pongo el mes. pero si pongo día y mes incompletos y no pongo el año, no me muestra ningun mensaje.

Archivos adjuntos


  • 0

#6 El_Chava

El_Chava

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 11 febrero 2015 - 12:11

Al fin logre dar con la respuesta del problema al darme cuenta de lo siguiente: lo que hice fue primeramente ver que valor me esta dando el TDateEdit si ponia los valores de esta manera '2_/2_/____' y en el evento onexit puse el siguiente codigo "dia:=formatDateTime('dd',fechaentrega.Date);mes:=formatDateTime('mm',fechaentrega.Date);anio:=formatDateTime('yyyy',fechaentrega.Date); " asi me di cuenta que las variables guardaban dia = 30 mes = 12 anio=1899 investigando resulta ser que es la manera en que tDateEdit lo toma como una fecha NULA 30/12/1899 asi que lo que hice fue poner el siguiente codigo:


delphi
  1. procedure TFrmAgregarDocumento.fechaentregaExit(Sender: TObject);
  2. var
  3. MyDateTimeVar: TDate;
  4. ex:integer;
  5. begin
  6. ex:=0;
  7. try
  8. MyDateTimeVar:= StrToDate(fechaentrega.Text);
  9. except
  10. Application.MessageBox('La fecha de entrega no es valida, favor de verificar','Error',mb_iconstop);
  11. ex:=1;
  12. end;// end del try
  13. case ex of
  14. 0:if FormatDateTime('DD/MM/YYYY',fechaentrega.Date) = '30/12/1899' then
  15. begin
  16. Application.MessageBox('La fecha de entrega no es valida, favor de verificar','Error',mb_iconstop);
  17. end;
  18. end;
  19. end;


Asi de esta manera logré que me valide si tengo una fecha valida. Gracias por su ayuda y sugerencias.

Archivos adjuntos


  • 0




IP.Board spam blocked by CleanTalk.