Código
No evento OnExit do objeto
procedure TForm1.Edit1Exit(Sender: TObject);
var Data : string;
begin
Data := Edit1.text;
CriticaData(Data); // Se não for um campo válido, a procedure devolve a variável data vazia;
if Data = '' then
Edit1.SetFocus
else
Edit1.text := DateToStr(StrToDate(Edit1.text));
end;
A procedure CriticaData sem o uso do evento OnKeyPress
procedure TForm1.CriticaData(var Data: string);//Sem controle
//dos caracteres digitados no objeto Edit1
var I, J, Dia, Mes, Ano : Integer;
Barras, Barra1, Barra2 : Integer; // Verifica a posição das barras;
K, M : Array Of Integer;
Num : Array Of String;
Caracter, Erro : String;
begin
Erro:='n'; //Em princípio o campo é considerado como correto(válido).
// Cria-se os Arrays K e M com 13 campos dos quais usaremos do 1 ao 12
SetLength (K, 13);
SetLength (M, 13);
// A matriz M é preenchida com o último dia de cada mês
// A matriz K é preenchida com 1. A posição relativa de cada caracter do campo
// data, dentro da matriz K, será prenchida com zero se o caracter for válido.
// Caso contrário será setado Erro igual a s
for I := 1 to 12 do begin
K[I] := 1;
M[I] := 31;
end;
M[4] := 30;
M[2] := 28;
M[6] := 30;
M[9] := 30;
M[11] := 30;
//Num contém os números e / para controle do campo data.
SetLength (Num, 11);
for I := 0 to 9 do
Num[I] := IntToStr(I);
Num[10] := '/';
// Barra controla a posição das duas // do campo data
Barras := 0; // Verifica a quantidade de barras digitadas
Barra1 := 0; // Posição da 1ª barra (pode ser 2 ou 3)
Barra2 := 0; // Posição da 2ª barra (pode ser 4, 5 ou 6)
for I := 1 to length(Data) do begin
Caracter := copy(Data,I,1);
if Caracter = '/' then begin
Barras := Barras + 1;
if Barra1 = 0 then Barra1 := I
else Barra2 := I;
end;
for J := 0 to 10 do
if Num[J] = Caracter then
K[I] := 0;
end;
//Se Algum elemento da variável Data não for válido
// seta o erro com s
for J := 1 to length(Data) do
if K[J] = 1 then Erro := 's';
if (length(data) < 6) or (length(data) > 10) then Erro := 's';
if Barras > 2 then Erro := 's';
if (Barra1 > 3) or (Barra1 < 2) then Erro := 's';
if (Barra2 > 6) or (Barra2 < 4) then Erro := 's';
// Até aqui já sabemos que a data está em formato válido com barras
if Erro = 'n' then begin
Caracter := Copy(Data,(Barra2 + 1),4);
if length(Caracter) < 4 then begin
Caracter := '20' + Caracter; // Se a data entrar no formato dd/mm/aa
// fazemos a data ficar dd/mm/20aa
Data := Copy(Data,1,Barra2)+Caracter;
end;
// Podemos converter as posições da string em inteiros sem receio de recebermos
// aquela mensagem de erro do delphi.
Dia := StrToInt(Copy(Data,1,(Barra1 - 1)));
Mes := StrToInt(Copy(Data,(Barra1+1),(Barra2 - Barra1 - 1)));
Ano := StrToInt(Copy(Data,(Barra2 + 1),4));
// Verifica se o ano é bissexto para a crítica do dia se o mês for fevereiro.
J := Ano mod 4;
if J = 0 then M[2] := 29
else M[2] := 28;
// Critica o mes
if (mes < 1) or (mes >12) then Erro := 's';
// Critica o dia
if Erro = 'n' then
if (dia < 1) or (dia > M[Mes]) then Erro := 's';
// critica o ano (Se quiser)
if ano < 2003 then Erro := 's';
end;
if Erro = 's' then begin
Data := '';
messageDlg('Data inconsistente!!!',mtError, // Esta será a única mensagem mostrada.
[mbOk],0);
end;
end;
A mesma procedure CriticaData, mais enxuta, porém, com o controle dos caracteres feito no evento OnKeyPress
procedure TForm1.CriticaData(var Data: string); //Com controle dos caracteres
//digitados no objeto Edit1 através do evento OnKeyPress
var I, J, Dia, Mes, Ano : Integer;
Barras, Barra1, Barra2 : Integer; // Verifica a posição das barras;
M : Array Of Integer;
Caracter, Erro : String;
begin
Erro:='n'; //Em princípio o campo é considerado como correto(válido).
// Cria-se o Array M com 13 campos dos quais usaremos do 1 ao 12
SetLength (M, 13);
// A matriz M é preenchida com o último dia de cada mês
for I := 1 to 12 do begin
M[I] := 31;
end;
M[4] := 30;
M[2] := 28;
M[6] := 30;
M[9] := 30;
M[11] := 30;
// Barra controla a posição das duas // do campo data
Barras := 0; // Verifica a quantidade de barras digitadas
Barra1 := 0; // Posição da 1ª barra (pode ser 2 ou 3)
Barra2 := 0; // Posição da 2ª barra (pode ser 4, 5 ou 6)
for I := 1 to length(Data) do begin
Caracter := copy(Data,I,1);
if Caracter = '/' then begin
Barras := Barras + 1;
if Barra1 = 0 then Barra1 := I
else Barra2 := I;
end;
end;
if (length(data) < 6) or (length(data) > 10) then Erro := 's';
if Barras > 2 then Erro := 's';
if (Barra1 > 3) or (Barra1 < 2) then Erro := 's';
if (Barra2 > 6) or (Barra2 < 4) then Erro := 's';
// Aqui já sabemos se a data é numérica e se está em formato válido com barras
if Erro = 'n' then begin
Caracter := Copy(Data,(Barra2 + 1),4);
if length(Caracter) < 4 then begin
Caracter := '20' + Caracter; // Se a data entrar no formato dd/mm/aa
// fazemos a data ficar dd/mm/20aa
Data := Copy(Data,1,Barra2)+Caracter;
end;
// Podemos converter as posições da string em inteiros sem receio de recebermos
// aquela mensagem de erro do delphi.
Dia := StrToInt(Copy(Data,1,(Barra1 - 1)));
Mes := StrToInt(Copy(Data,(Barra1+1),(Barra2 - Barra1 - 1)));
Ano := StrToInt(Copy(Data,(Barra2 + 1),4));
// Verifica se o ano é bissexto
J := Ano mod 4;
if J = 0 then M[2] := 29
else M[2] := 28;
// Critica o mes
if (mes < 1) or (mes >12) then Erro := 's';
// Critica o dia
if Erro = 'n' then
if (dia < 1) or (dia > M[Mes]) then Erro := 's';
// critica o ano (Se quiser)
if ano < 2003 then Erro := 's';
end;
if Erro = 's' then begin
Data := '';
messageDlg('Data inconsistente!!!',mtError,
[mbOk],0);
end;
Procedure que controla os caracteres digitados
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key = Chr(vk_Back)) then // Este if habilita a tecla Backspace para correção do objeto
if not (Key in ['0'..'9','/']) then // Este if permite a digitação somente de números e da barra /
abort;
end;
Preenchimento de zeros para completar a data
// Se quiser que a data seja sempre mostrada com preenchimento de zeros nos meses e dias //menores que dez então, na form principal do aplicativo ou na form que você estiver //trabalhando, acrescente o comando abaixo no evento OnCreate.
procedure TForm1.FormCreate(Sender: TObject);
begin
ShortDateFormat := 'dd/mm/yyyy'; // pode-se usar ‘dd/mm/yy’ para exibição no formato curto
end;
Pronto!!! É só escolher a que mais lhe agradar e correr para o abraço.
Nunca mais você vai receber a mensagem de erro do delphi para este caso.
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009