 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
R.J.Dio Novato

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 25
|
Enviada: Sex Abr 16, 2010 9:40 pm Assunto: Problemas para validar campos MaskEdit ! |
|
|
Olá, esse é meu primeiro post aqui, eu sou iniciante em Delphi (uso o Delphi 7).
Tenho campos MaskEdit na minha aplicação e quero fazer o seguinte:
Ao clicar no botão Confirmar, ele verifica se o campo está vázio, depois se não tiver ele faz outras verificações.
Exemplo, um campo MaskEdit de CPF, quero verificar se ele está vazio, se estiver da uma mensagen e volta o foco no campo, se tiver algum conteudo, ele verifica se está TODO preenchido, caso contrário se digitar apenas 1 digito ele passa.
Tentei vários modos, com Length se eu usar uma mascara:
999.999.999-99;1;_ por exemplo, sempre retorna 14, mesmo se tiver vazia. Mas se eu utilizar:
999.999.999-99;0;_ se estiver vázio retorna 0, mas se eu digitar por exemplo no ultimo espaço do MaskEdit (no fim dele, tipo depois do '-') ele conta os primeiros espaços vazios como se estivesse preenchido, e não é isso que eu quero.
Acho que uma solução, seria o usuário ser obrigado a digitar desde o começo, não podendo mudar a posição do cursor dentro do MaskEdit.
Mas eu são sei fazer isso.
Ficou meio complicado de entender mas estou ficando loco com isso !
Abraço |
|
| Voltar ao Topo |
|
 |
lucas_alves Colaborador


Registrado: Domingo, 30 de Agosto de 2009 Mensagens: 1632 Localização: São Gonçalo - Rio de Janeiro
|
Enviada: Sex Abr 16, 2010 10:09 pm Assunto: |
|
|
R.J.Dio, Seja Bem-Vindo ao forum ActiveDelphi,
Código para Validar o CPF:
| Código: |
function TestaCpf( xCPF:String ):Boolean;
{Testa se o CPF é válido ou não}
Var
d1,d4,xx,nCount,resto,digito1,digito2 : Integer;
Check : String;
Begin
d1 := 0; d4 := 0; xx := 1;
for nCount := 1 to Length( xCPF )-2 do
begin
if Pos( Copy( xCPF, nCount, 1 ), '/-.' ) = 0 then
begin
d1 := d1 + ( 11 - xx ) * StrToInt( Copy( xCPF, nCount, 1 ) );
d4 := d4 + ( 12 - xx ) * StrToInt( Copy( xCPF, nCount, 1 ) );
xx := xx+1;
end;
end;
resto := (d1 mod 11);
if resto < 2 then
begin
digito1 := 0;
end
else
begin
digito1 := 11 - resto;
end;
d4 := d4 + 2 * digito1;
resto := (d4 mod 11);
if resto < 2 then
begin
digito2 := 0;
end
else
begin
digito2 := 11 - resto;
end;
Check := IntToStr(Digito1) + IntToStr(Digito2);
if Check <> copy(xCPF,succ(length(xCPF)-2),2) then
begin
Result := False;
end
else
begin
Result := True;
end;
end;
|
Remove as mascaras do MaskEdit, e espaços em branco:
| Código: |
Function LimparMascara(Valor : String) : String;
begin
Trim(Valor);
Valor := StringReplace(Valor, '-', '', [rfReplaceAll]);
Valor := StringReplace(Valor, '_', '', [rfReplaceAll]);
Valor := StringReplace(Valor, '.', '', [rfReplaceAll]);
Result:=Valor;
end;
|
Botão Confirmar:
| Código: |
procedure TForm1.Button1Click(Sender: TObject);
begin
if not TestaCpf(LimparMascara(MaskEdit1.Text)) then
begin
ShowMessage('CPF Inválido');
MaskEdit1.SetFocus;
Exit;
end;
//Retante do codigo...
ShowMessage(Cpf 'Validado com sucesso!');
end;
|
Abraços!!! _________________ Agora eu também programo em PHP. |
|
| Voltar ao Topo |
|
 |
R.J.Dio Novato

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 25
|
Enviada: Sáb Abr 17, 2010 3:16 pm Assunto: |
|
|
Valeu pela resposta lucas, mas meu problema é com todos os MaskEdits, não só CPF.
Esse do CPF funcionou de várioz modos, mas se eu digito _12.123.123-12
repare que falta 1 caracter no começo, ao apertar o botão confirar da uma menssagen assim:
| Citação: | | ' ' is not a valid integer value. |
Aos MaskEdits no geral, eu gostaria de fazer uma validação que checa se ta vazio, se estiver da uma msg, se nao, verifica se está todos digitado (no caso se for obrigado a digitar um certo numero de caracters como o caso do CPF ou Telefone).
Eu meio que já consegui fazer, o unico problema é que o usuario pode digitar em qualquer espaço do MaskEdit.
Tem como forçar digitar só desde o primeiro espaço do MaskEdit, sem poder mudar ?
Se eu conseguir isso meus problemas acabam. |
|
| Voltar ao Topo |
|
 |
lucas_alves Colaborador


Registrado: Domingo, 30 de Agosto de 2009 Mensagens: 1632 Localização: São Gonçalo - Rio de Janeiro
|
Enviada: Sáb Abr 17, 2010 7:44 pm Assunto: |
|
|
| R.J.Dio escreveu: |
Esse do CPF funcionou de várioz modos, mas se eu digito _12.123.123-12
repare que falta 1 caracter no começo, ao apertar o botão confirar da uma menssagen assim:
| Citação: | | ' ' is not a valid integer value. |
|
Tenta com esse código, fiz algumas modificações:
| Código: |
(*Para não exibir a mensagem de erro, rode o programa fora do Delphi*)
function TestaCpf( xCPF:String ):Boolean;
{Testa se o CPF é válido ou não}
Var
d1,d4,xx,nCount,resto,digito1,digito2 : Integer;
Check : String;
Begin
try
d1 := 0; d4 := 0; xx := 1;
for nCount := 1 to Length( xCPF )-2 do
begin
if Pos( Copy( xCPF, nCount, 1 ), '/-.' ) = 0 then
begin
d1 := d1 + ( 11 - xx ) * StrToInt( Copy( xCPF, nCount, 1 ) );
d4 := d4 + ( 12 - xx ) * StrToInt( Copy( xCPF, nCount, 1 ) );
xx := xx+1;
end;
end;
resto := (d1 mod 11);
if resto < 2 then
begin
digito1 := 0;
end
else
begin
digito1 := 11 - resto;
end;
d4 := d4 + 2 * digito1;
resto := (d4 mod 11);
if resto < 2 then
begin
digito2 := 0;
end
else
begin
digito2 := 11 - resto;
end;
Check := IntToStr(Digito1) + IntToStr(Digito2);
if Check <> copy(xCPF,succ(length(xCPF)-2),2) then
begin
Result := False;
end
else
begin
Result := True;
end;
except
Result:=False;
end;
end;
|
Permitir que seja digitado somente numeros no MaskEdit,
Evento OnKeyPress do MaskEdit:
| Código: |
if not (key in ['0'..'9',Chr(8)]) then Key:=#0
|
_________________ Agora eu também programo em PHP. |
|
| Voltar ao Topo |
|
 |
lucas_alves Colaborador


Registrado: Domingo, 30 de Agosto de 2009 Mensagens: 1632 Localização: São Gonçalo - Rio de Janeiro
|
Enviada: Sáb Abr 17, 2010 7:51 pm Assunto: |
|
|
Continuação...
Validar MaskEdit:
Exemplo do CPF, Evento OnExit:
| Código: | procedure TForm1.MaskEdit1Exit(Sender: TObject);
begin
(* * Exemplo do CPF * *)
if not (Length(LimparMascara(TMaskEdit(Sender).Text))=11) then
begin
Application.MessageBox('O numero do CPF está incompleto!','CPF Inválido',MB_ICONEXCLAMATION);
TMaskEdit(Sender).Clear;
end;
end;
|
Exemplo do botão confirmar:
| Código: |
If not (Length(LimparMascara(MaskEdit1.Text))>0) then
begin
Application.MessageBox('CPF Vazio','Erro',MB_ICONERROR);
Exit;
end;
if not TestaCpf(LimparMascara(MaskEdit1.Text)) then
begin
Application.MessageBox('CPF Inválido','Erro',MB_ICONERROR);
MaskEdit1.SetFocus;
Exit;
end;
//Restante do codigo...
Application.MessageBox('Cpf Validado com sucesso!','Operação Efetuada',MB_ICONINFORMATION);
|
Ps: Tive que postar em duas vezes porque o Forum estava extraviando meu post.
Abraços!!! _________________ Agora eu também programo em PHP. |
|
| Voltar ao Topo |
|
 |
R.J.Dio Novato

Registrado: Sexta-Feira, 16 de Abril de 2010 Mensagens: 25
|
Enviada: Sáb Abr 17, 2010 8:14 pm Assunto: |
|
|
Nossa cara, essa funcionou perfeito.
Eu tinha esquecido de mencionar que estou usando a mascara não com um MaskEdit mas sim em um DBEdit (fiz a mascara na tabela do DM), só mudei o nome dos botões e deu.
Agora vou tentar ajustar para outros tipos de mascaras da minha aplicação. Tenho de hora (hh:mm) e telefone e rg.
Muito Obrigado mesmo !
Se eu não conseguir adaptar para as outras máscaras eu volto a encher o saco aqui.
E se tiver um jeito diferente de validar por eu estar usando a máscara direto na tabela diga-me.
Abraço.
--- EDIT ---
Andei testando mais aqui e vi que todos os erros estão dando a mesma menssagen de "CPF Inválido" ou seja, as outras verificações não estão funcoinando, se ele está vazio ou incompleto não funcionam.
Mas não faz mal, ta mim ta funcionando legal.
Lucas esse código abaixo é o teu, mas retirei umas coisas e está dando o mesmo resultado, que pra mim já é o suficiente.
A função LimparMascara e os eventos foram retirados, só ficou a função TestaCpf e o código abaixo:
Código no botão confirma:
| Código: | if not TestaCpf(DBEdit5.Text) then
begin
Application.MessageBox('CPF Inválido','Erro',MB_ICONWARNING);
DBEdit5.SetFocus;
Exit;
end; |
E ficou igual se eu tivesse colocado todos os teus códigos, por isso eu retirei bastante coisa, porque não estava fazendo efeito. |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|