sábado, 23 de novembro de 2024
Home
Artigos
Banco de Dados
Access
Firebird
Microsoft SQL Server
MySql
Oracle
Sybase
BI
QlikView
Dicas de Internet
e-business
Hardware
Multimídia
Flash
Programação
.NET/ASP.NET
.NET/C#
.NET/Framework
.NET/VB.NET
ASP
C/C++
Clipper
Cobol
CSS
Delphi
Java
Javascript
JSP
Palm
Perl
PHP
Shell
Visual Basic
WAP
Redes
Segurança
Servidores E-mail
Servidores Web
Apache
Microsoft IIS
Sistemas Operacionais
AIX
DOS
HPUX
Linux
Palm OS
Solaris
True64
Windows 7
Windows 9X
Windows NT
Windows Vista
Windows XP
Software Review
PC
Storages
Veritas VM
Conteúdo atual do site:
[807] ítens, entre artigos, funções e documentos.
Pesquisa Rápida:
Últimos 3 acessos:
Alexandre Neves 03/03/2015 11:08:01 167 acesso(s) alexandre neves 03/03/2015 11:06:42 1 acesso(s) Marcelo Torres 21/01/2015 15:24:53 61 acesso(s)
Opções:
Listagem completa Listagem simples
Ranking Colaboradores:
Adenilton Rodrigues - [304] Alexandre Neves - [61] Douglas Freire - [54] Marcelo Giovanni - [53] Marcelo Torres - [43] Angelita Bernardes - [31] Addy Magalhães Cunha - [28] Manuel Fraguas - [24] Ludmila Valadares - [20] Marcelo Capelo - [18]
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';//or // (length(data) = 9) 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. Quebra-Linha Colaborador..: Carlos A. S. Queiroz Categoria(s).: Artigos; Delphi; Versão.......: 1 Data.........: 17/03/2006 14:58:31 Visualizado..: 9243 vezes Fonte........: Nenhuma
Carlos A. S. Queiroz
Artigos Delphi
Últimos Artigos deste colaborador CRÍTICA DE DATAS NO OBJETO EDIT SEM MENSAGEM DE ERRO DO DELPHI - 17/03/2006 14:58:31
Últimos Artigos desta categoria Desabilitar IPv6 de produtos Microsoft - 07/06/2011 11:15:16 Erro ao executar VSphere Windows 2003, 2008 e 7 - 10/06/2010 15:44:32 Comparação Data no Oracle - 24/07/2008 13:25:00
166 pessoa(s) on-line neste site.