Ver Mensaje Individual
  #1  
Antiguo 24-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Vales08.

Lo que te sugirieron el amigo Caral y seguidamente BlueSteel es la opción más simple y eficiente. Si no te agrada el DateTimePicker, seguramente haya algún otro componente que lo haga de la forma que deseas. No conozco ninguno, y precisamente eso me convence de su existencia.

Usando un TDBEdit se me ocurre que una forma de controlar lo ingresado, es verificarlo en el evento OnSetText del TField a evaluar, ya que este evento se produce cuando la propiedad Text recibe un nuevo valor y antes de ser aplicado.

Hay que redactar código y lo hará al salir del DBEdit. Evaluarlo mientras estás escribiendo no lo veo viable ya que por ejemplo es lícito ingresar un día mayor a 30 siempre que no esté seguido del mes de abril, lo mismo un día 29 si no esta seguido del mes de enero y de un año no bisiesto. Y como el programa no puede adivinar que mes y año serán ingresados seguidamente...

Un ejemplo como para hacercarte una idea:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  DataSet.FieldByName('FECHA').OnSetText:= CampoSetText;
  DataSet.FieldByName('FECHA').EditMask:= '!99/99/0000;1;_'; 
end;

procedure TForm1.CampoSetText(Sender: TField; const Text: String);
{$J+}
const
   DiaM :array[1..12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31);
{$J-}
var
  dd,mm,yy: Integer;
begin
  if (Trim(Copy(Text,1,2))='')or(Trim(Copy(Text,4,2))='')or(Trim(Copy(Text,7,4))='') then
    raise Exception.Create('Formato de fecha inválido');
  TryStrToInt(Copy(Text,7,4),yy);
  TryStrToInt(Copy(Text,4,2),mm);
  TryStrToInt(Copy(Text,1,2),dd);
  if ((yy mod 4=0)and(yy mod 100<>0))or(yy mod 400=0) then inc(DiaM[2]);
  if not (mm in [1..12]) then
    raise Exception.Create('Mes erróneo');
  if not (dd in [1..DiaM[mm]]) then
    raise Exception.Create('Día erróneo');
end;
...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-05-2011 a las 01:04:20.
Responder Con Cita