Buscar

Crítica de datas no objeto edit sem mensagem de erro do delphi

Código

Depois de correr atrás, em vão, de uma rotina que fizesse uma crítica ou validação de data em um objeto edit sem que me fosse exibida a mensagem de erro do delphi, resolvi fazer a minha própria e funciona bem. Pode-se digitar qualquer coisa que o tratamento é perfeito.

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.
 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Data e hora
Adicionada dia: 25/07/05
Por: Carlos A. S. Queiroz
Visualizada: 7805 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009