Hola Compañeros del Foro !
Intento validar y autocompletar una fecha dentro de un TDBEdit. Para ello he hecho uso del método descrito en
http://delphi.about.com/od/adptips20...ltip0305_3.htm
Ligeramente modificado, me ha quedado el siguiente componente denominado TDBDateEdit
Código Delphi
[-]unit DBDateEdit;
interface
uses
SysUtils, Classes, System.ComponentModel, Borland.Vcl.Controls,
Borland.Vcl.StdCtrls, Borland.Vcl.Mask, Borland.Vcl.DBCtrls, DateUtils;
type
TDBDateEdit = class(TDBEdit)
private
procedure DateComplete;
protected
public
procedure ValidateEdit; override;
published
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Data Controls', [TDBDateEdit]);
end;
procedure TDBDateEdit.DateComplete;
var
DateStr : string;
Year, Month, Day : Word;
cnt, SepCount : Integer;
begin
DateStr := Text;
if DateStr = '' then Exit;
SepCount := 0;
for cnt := 1 to Length(DateStr) do begin
if not (DateStr[cnt] in ['0'..'9']) then begin
DateStr[cnt] := '/';
Inc(SepCount);
end;
end;
while (DateStr <> '') and (DateStr[Length(DateStr)] = '/') do begin
Delete(DateStr, Length(DateStr), 1);
Dec(SepCount);
end;
DecodeDate(Now, Year, Month, Day);
if SepCount = 0 then begin
case Length(DateStr) of
0 : DateStr := DateToStr(Now);
1, 2 : DateStr := DateStr + '/' + IntToStr(Month);
4 : Insert('/', DateStr, 3) ;
6, 8 : begin
Insert('/', DateStr, 5) ;
Insert('/', DateStr, 3) ;
end;
end;
end;
try
Text := DateToStr(StrToDate(DateStr));
except
abort;
end;
end;
procedure TDBDateEdit.ValidateEdit;
var
pos : integer;
begin
if not Validate(Text, pos) then
DateComplete;
inherited;
end;
end.
Necesito un achuchón final.
El autocompletar funciona a la perfección. Pero me sigue saltando un error de 'Invalid Date' si introduzco p.ej. 29/02/2006. En cambio funciona bien, abortando la operación, si p.ej. introduzco en la fecha '89' como día.
Por otro lado también me gustaría poder llamar desde algún lado a mi propia rutina de mensaje de error que se encuentra en el programa principal en el cual hago uso del componente modificado, indicando p.ej. en el caso anterior de que se introdujera 29 de Febrero de 2006, u '89' en el día, que la fecha introducida es erronea.
Donde debería llamar a dicha rutina propia, o qué valor debería devolver en el componente para interceptar algún evento en mi programa principal ?
Como siempre, gracias por vuestra ayuda, y como no, aprovechar esta ocasión para desearos a todos Felices Fiestas y un Próspero Año Nuevo 2007.