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.