Detectar click num botão
Tenho 5 Edits num form.
Na primeira é digitado um numero de CPF, e no evento OnClose dessa Edit manda checar a validade do CPF numa função.
No meu projeto mudo de Edits com o Enter, isso significa que quando digito o CPF e dou o Enter, valida o CPF e se for verdadeiro vai me pedir o próximo dado na próxima Edit.
Até aí tudo bem, porem, se eu não quiser digitar o CPF e voltar ao Form anterior, clico num botão, e como estou ativando o OnClose daquela Edit, e como a Edit está vazia, dá a mensagem de que o CPF é inválido, pois antes de atender o ´Voltar´ do botão, ele vai tentar validar o CPF.
Tem como, no inicio da procedure de validação, eu colocar uma condição de que se o botão ´Voltar´ foi clicado, simplesmente não executar a validação?
Eu coloquei assim, mas na checagem do projeto já dá um erro de que falta parâmetros.
[b:5e3ad6617d]if BtVoltar.OnClick then
Close;[/b:5e3ad6617d]
O que falta?
Obrigado
Na primeira é digitado um numero de CPF, e no evento OnClose dessa Edit manda checar a validade do CPF numa função.
No meu projeto mudo de Edits com o Enter, isso significa que quando digito o CPF e dou o Enter, valida o CPF e se for verdadeiro vai me pedir o próximo dado na próxima Edit.
Até aí tudo bem, porem, se eu não quiser digitar o CPF e voltar ao Form anterior, clico num botão, e como estou ativando o OnClose daquela Edit, e como a Edit está vazia, dá a mensagem de que o CPF é inválido, pois antes de atender o ´Voltar´ do botão, ele vai tentar validar o CPF.
Tem como, no inicio da procedure de validação, eu colocar uma condição de que se o botão ´Voltar´ foi clicado, simplesmente não executar a validação?
Eu coloquei assim, mas na checagem do projeto já dá um erro de que falta parâmetros.
[b:5e3ad6617d]if BtVoltar.OnClick then
Close;[/b:5e3ad6617d]
O que falta?
Obrigado
Cps.art
Curtidas 0
Respostas
Daykas
01/12/2007
Prezado! A validação de CPF tem uma falha gritante, pois qualquer número que utilize uma função aritmetica com zero sempre será zero. Por isso, pode utilizar a sequencia de 11 zeros.
GOSTEI 0
Cps.art
01/12/2007
Caro daykas, obrigado.
O meu problema não é esse que você citou.
Quanto aos cálculos aritiméticos para se chegar ao DV do CPF, isso eu já fiz.
Dê mais uma olhada na mensagem que abre este tópico e verá que meu problema é detectar o click de um botão.
Abraços.
O meu problema não é esse que você citou.
Quanto aos cálculos aritiméticos para se chegar ao DV do CPF, isso eu já fiz.
Dê mais uma olhada na mensagem que abre este tópico e verá que meu problema é detectar o click de um botão.
Abraços.
GOSTEI 0
Renan.cb
01/12/2007
nao dá pra testar se o conteudo do editCpf for vazio passa? Quando for vazio nao faz validação.
GOSTEI 0
Cps.art
01/12/2007
Olá Renan.cb.
Não dá pra fazer isso não, pois de qualquer jeito que eu sair da EditCpf a validação é feita, tanto que o evento OnClose dessa Edit manda para a função de validação, e um número de CPF vazio, é um CPF inválido.
Eu tenho que descobrir uma forma de quando eu clicar num botão para voltar ao form anterior, e o OnClose da EditCpf direcionar-se para a função de validação, lá, naquela procedure, colocar uma linha de código que checa se o desvio foi por dar o Enter na Edit (aí faz a validação), ou se foi um click do botão ´Voltar´( então não faria a validação).
É isso que tá pegando.
Não dá pra fazer isso não, pois de qualquer jeito que eu sair da EditCpf a validação é feita, tanto que o evento OnClose dessa Edit manda para a função de validação, e um número de CPF vazio, é um CPF inválido.
Eu tenho que descobrir uma forma de quando eu clicar num botão para voltar ao form anterior, e o OnClose da EditCpf direcionar-se para a função de validação, lá, naquela procedure, colocar uma linha de código que checa se o desvio foi por dar o Enter na Edit (aí faz a validação), ou se foi um click do botão ´Voltar´( então não faria a validação).
É isso que tá pegando.
GOSTEI 0
Facc
01/12/2007
Olá Renan.cb.
Não dá pra fazer isso não, pois de qualquer jeito que eu sair da EditCpf a validação é feita, tanto que o evento OnClose dessa Edit manda para a função de validação, e um número de CPF vazio, é um CPF inválido.
Eu tenho que descobrir uma forma de quando eu clicar num botão para voltar ao form anterior, e o OnClose da EditCpf direcionar-se para a função de validação, lá, naquela procedure, colocar uma linha de código que checa se o desvio foi por dar o Enter na Edit (aí faz a validação), ou se foi um click do botão ´Voltar´( então não faria a validação).
É isso que tá pegando.
Amigo, tenta assim
if Trim(EdtCPF.Text) <> ´´ then
Faz validação
GOSTEI 0
Renan.cb
01/12/2007
só checando, acho que tu te enganaste pois nao existe evento onClose no Tedit, acho que tu quis dizer onExit.
Tu deves ter feito um codigo para testar se a tecla apertada dentro do edit foi o enter, certo? entao cria uma variavel booleana e testa ela na função de validação. quando clicar no botao seta false para a variavel quando pressionar seta true.
nao é muito bonito, mas é uma forma de fazer.
Tu deves ter feito um codigo para testar se a tecla apertada dentro do edit foi o enter, certo? entao cria uma variavel booleana e testa ela na função de validação. quando clicar no botao seta false para a variavel quando pressionar seta true.
nao é muito bonito, mas é uma forma de fazer.
GOSTEI 0
Renan.cb
01/12/2007
só corrigindo o que escrevi.
quando pressionar enter seta true para a variavel, quando clicar no botao seta false. dentro do metodo de validação tu testas essa variavel booleana. se for true (veio do enter) nao valida.
quando pressionar enter seta true para a variavel, quando clicar no botao seta false. dentro do metodo de validação tu testas essa variavel booleana. se for true (veio do enter) nao valida.
GOSTEI 0
Cps.art
01/12/2007
É verdade Renan, o evento da Edit é OnExit e não OnClose.
Confundi na postagem da mensagem.
Obrigado
Confundi na postagem da mensagem.
Obrigado
GOSTEI 0
Aeciovc
01/12/2007
Cara, pq vc não coloca essa procedure de checagem na hora que ele clicar em um botão por exemplo ´Cadastrar´?? assim a validação é feita quando ele tentar cadastrar, podendo voltar a hora que quiser pro outro form!!
GOSTEI 0
Cps.art
01/12/2007
Caro aeciovc, obrigado pela atenção, mas como citei na abertura deste tópico, a idéia é não usar botões e nem o mouse.
Uso o ENTER para mudar de Edits, pois num trabalho com um grande volume de digitação, é muito mais rápido não ter que tirar a mão do teclado para mover o ponteiro do mouse e clicar num botão.
Como o CPF é o primeiro dado a ser digitado e se ele já estiver no banco de dados aproveito para carregar diversas Edits com dados já digitados anteriormente, evitando assim ter que digitar novamente o nome, endereço, telefone, etc do titular.
Então tenho que validar esse CPF antes de mais nada e em seguida procura-lo no banco de dados.
Já imaginou o cara digitar uma tela inteira de dados, clicar num botão para ´cadastrar´ e o CPF não ser validado.
Ai move o ponteiro do mouse até a Edit, redigita o CPF, clica no botão novamente e só ai percebe que aquele CPF já estava cadastrado e que ele digitou uma porção de dados sem necessidade.
Como sou usuário de grandes sistemas que prestam serviços ao governo do estado, tenho sentido na pele a incompetência dos chamados grandes programadores que fazem exatamente isso que citei acima, com um agravante, dá a mensagem que o CPF é inválido e limpa todos os dados digitados, numa tela com mais de 30 ítens.
Não sei como ainda, mas vou conseguir resolver meu problema e que o sistema funcione da forma que eu quero.
Então deixem suas sugestões e dicas que serão sempre bem vindas.
Obrigado mais uma vez aeciovc.
Uso o ENTER para mudar de Edits, pois num trabalho com um grande volume de digitação, é muito mais rápido não ter que tirar a mão do teclado para mover o ponteiro do mouse e clicar num botão.
Como o CPF é o primeiro dado a ser digitado e se ele já estiver no banco de dados aproveito para carregar diversas Edits com dados já digitados anteriormente, evitando assim ter que digitar novamente o nome, endereço, telefone, etc do titular.
Então tenho que validar esse CPF antes de mais nada e em seguida procura-lo no banco de dados.
Já imaginou o cara digitar uma tela inteira de dados, clicar num botão para ´cadastrar´ e o CPF não ser validado.
Ai move o ponteiro do mouse até a Edit, redigita o CPF, clica no botão novamente e só ai percebe que aquele CPF já estava cadastrado e que ele digitou uma porção de dados sem necessidade.
Como sou usuário de grandes sistemas que prestam serviços ao governo do estado, tenho sentido na pele a incompetência dos chamados grandes programadores que fazem exatamente isso que citei acima, com um agravante, dá a mensagem que o CPF é inválido e limpa todos os dados digitados, numa tela com mais de 30 ítens.
Não sei como ainda, mas vou conseguir resolver meu problema e que o sistema funcione da forma que eu quero.
Então deixem suas sugestões e dicas que serão sempre bem vindas.
Obrigado mais uma vez aeciovc.
GOSTEI 0
Dedi
01/12/2007
cps.art, trabalho da mesmo forma que voce, isso para evitar a digitação desnecessaria de dados ,os usuarios não podem perder tempo principalmente quando tem um cliente esperando em sua frente. como solução para a validação e o cancelamento da mesma faço sempre assim:
incluo um botão logo depois do edit do cpf os demais ficam dentro de uma panel desabilitados,quando o usuario teclar enter o foco vai pro botão + um enter e é feita a validação do cpf se ok procura no banco e abilita o panel com os edits ( se já cadastrado preenche os edits). se o cpf não for válido então volta o foco pro edit1 e informa que o documento não é valido, caso queira desistir basta fechar a janela,nenhuma validação é feita no onexit do edit.
Esta é a forma que trabalho e tenho conseguido uma boa eficiencia com ela.
obs.
já vi em muitos sistemas em que o usuario tem que ficar digitando e usando o mouse a todo instante, informa um dado em um edit no topo da tela e tem que clicar com mouse lá no rodapé pra validar,isso não tá certo mesmo.
incluo um botão logo depois do edit do cpf os demais ficam dentro de uma panel desabilitados,quando o usuario teclar enter o foco vai pro botão + um enter e é feita a validação do cpf se ok procura no banco e abilita o panel com os edits ( se já cadastrado preenche os edits). se o cpf não for válido então volta o foco pro edit1 e informa que o documento não é valido, caso queira desistir basta fechar a janela,nenhuma validação é feita no onexit do edit.
Esta é a forma que trabalho e tenho conseguido uma boa eficiencia com ela.
obs.
já vi em muitos sistemas em que o usuario tem que ficar digitando e usando o mouse a todo instante, informa um dado em um edit no topo da tela e tem que clicar com mouse lá no rodapé pra validar,isso não tá certo mesmo.
GOSTEI 0
Cps.art
01/12/2007
É isso aí Dedi.
Gostei da sua idéia.
Não tinha pensado nisso.
Apesar da existência do botão, não há necessidade do uso do mouse, apenas o Enter.
Vou adaptar aqui no meu sistema e volta a postar o resultado.
Valeu.
Gostei da sua idéia.
Não tinha pensado nisso.
Apesar da existência do botão, não há necessidade do uso do mouse, apenas o Enter.
Vou adaptar aqui no meu sistema e volta a postar o resultado.
Valeu.
GOSTEI 0
Mano_froids
01/12/2007
É isso aí Dedi.
Gostei da sua idéia.
Não tinha pensado nisso.
Apesar da existência do botão, não há necessidade do uso do mouse, apenas o Enter.
Vou adaptar aqui no meu sistema e volta a postar o resultado.
Valeu.
Acho que posso ajudar, eu estava com o mesmo problema seu ... tenho um formulário com um campo CPF com MaskEdit e a validação é feita assim que sair do MaskEdit, consegui na internet uma validação, mas quando ficava em branco o campo dava um erro então fiz uma pequena modificação do código... só coloquei uma condição se o campo estiver em branco não faz a validação, ai funcionou bem.... só que ainda estou com problema nessa validação, quando o usuário não digita todos os numeros do cpf também da erro ai esse erro ainda não consegui solucionar.
Espero ter ajudado e se postar o seu código acho que fica mais fácil para podermos ajudar.
GOSTEI 0
Mano_froids
01/12/2007
[quote:3ca2419235=´cps.art´]É isso aí Dedi.
Gostei da sua idéia.
Não tinha pensado nisso.
Apesar da existência do botão, não há necessidade do uso do mouse, apenas o Enter.
Vou adaptar aqui no meu sistema e volta a postar o resultado.
Valeu.
Acho que posso ajudar, eu estava com o mesmo problema seu ... tenho um formulário com um campo CPF com MaskEdit e a validação é feita assim que sair do MaskEdit, consegui na internet uma validação, mas quando ficava em branco o campo dava um erro então fiz uma pequena modificação do código... só coloquei uma condição se o campo estiver em branco não faz a validação, ai funcionou bem.... só que ainda estou com problema nessa validação, quando o usuário não digita todos os numeros do cpf também da erro ai esse erro ainda não consegui solucionar.
Espero ter ajudado e se postar o seu código acho que fica mais fácil para podermos ajudar.[/quote:3ca2419235]
Teste esse código ai no seu sistema.
function TFmClientes.TestaCPF(Dado : string) : boolean;
var D1 : array[1..9] of byte;
I,
DF1,
DF2,
DF3,
DF4,
DF5,
DF6,
Resto1,
Resto2,
PrimeiroDigito,
SegundoDigito : integer;
begin
Result := true;
if Length(Dado) = 11 then
begin
for I := 1 to 9 do
if Dado[I] in [´0´..´9´] then
D1[I] := StrToInt(Dado[I])
else
Result := false;
if Result then
begin
DF1 := 0;
DF2 := 0;
DF3 := 0;
DF4 := 0;
DF5 := 0;
DF6 := 0;
Resto1 := 0;
Resto2 := 0;
PrimeiroDigito := 0;
SegundoDigito := 0;
DF1 := 10*D1[1] + 9*D1[2] + 8*D1[3] + 7*D1[4] + 6*D1[5] + 5*D1[6] +
4*D1[7] + 3*D1[8] + 2*D1[9];
DF2 := DF1 div 11;
DF3 := DF2 * 11;
Resto1 := DF1 - DF3;
if (Resto1 = 0) or (Resto1 = 1) then
PrimeiroDigito := 0
else
PrimeiroDigito := 11 - Resto1;
DF4 := 11*D1[1] + 10*D1[2] + 9*D1[3] + 8*D1[4] + 7*D1[5] + 6*D1[6] +
5*D1[7] + 4*D1[8] + 3*D1[9] + 2*PrimeiroDigito;
DF5 := DF4 div 11;
DF6 := DF5 * 11;
Resto2 := DF4 - DF6;
if (Resto2 = 0) or (Resto2 = 1) then
SegundoDigito := 0
else
SegundoDigito := 11 - Resto2;
if (PrimeiroDigito <> StrToInt(Dado[10])) or
(SegundoDigito <> StrToInt(Dado[11])) then
Result := false;
end;
end
else
if Length(Dado) <> 0 then
Result := false;
end;
procedure TFmClientes.MaskEdit1Exit(Sender: TObject);
begin
If not testacpf(MaskEdit1.text) then
Begin
ShowMessage(´CPF Inválido !!´);
MaskEdit1.Text := ´´;
MaskEdit1.SetFocus;
End
Else
end;
GOSTEI 0
Renan.cb
01/12/2007
caro Mano_Froids,
assim como tu fizeste uma verificação se o maskedit é vazio, faça uma para ver se ele é menor que 11 ou 14 (cnpj). Lembre-se de aumentar esse valor caso você esteja passando os caracteres ´especiais´ (.-/).
abraço
assim como tu fizeste uma verificação se o maskedit é vazio, faça uma para ver se ele é menor que 11 ou 14 (cnpj). Lembre-se de aumentar esse valor caso você esteja passando os caracteres ´especiais´ (.-/).
abraço
GOSTEI 0
Cps.art
01/12/2007
Olá Mano_Froids, obrigado pela atenção.
Eu não tenho problema quanto a validação do CPF.
Montei uma função e funciona bem, até para números incompletos do CPF, meu problema é que uso o Enter para passar de Edits, e no evento OnExit da Edit onde digito o CPF, manda para a função de validação antes de me pedir os dados da Edit seguinte.
Como a primeira Edit de meu form é a que pede o CPF, quando quero voltar para a tela anterior e clico num BOTÃO VOLTAR, antes de voltar a checagem do CPF é feita, mesmo com a Edit vazia, dando a mensagem que o CPF é inválido.
Eu queria que quando eu clicasse no Botão Voltar, a checagem não fosse feita, não porque a Edit estivesse vazia, mas sim porque cliclei no botão.
E isso não consegui fazer ainda.
Minha função de validação de CPF não está dando erro, e se quiser testa-la, ai abaixo vai o código:
[b:24fad05e57]function VCpf(ParVcpf : string) : string;
var
CpfNew : String;
MultVcpf : Integer;
SomaVcpf : Integer;
lk : Integer;
DpVcpf : Integer;
Digito : String;
begin
if (length(trim(ParVcpf))<> 11) or (ParVcpf=´00000000000´) or (ParVcpf=´99999999999´) then [color=red:24fad05e57]//observe esta linha[/color:24fad05e57]
begin
Result := ´F´;
Exit;
end;
CpfNew := Copy(ParVcpf,1,9);
MultVcpf := 2;
SomaVcpf := 0;
for lk := 9 downto 1 do
begin
SomaVcpf := SomaVcpf + (MultVcpf * StrToInt(Copy(CpfNew,lk,1)));
MultVcpf := MultVcpf + 1;
end;
DpVcpf := 11 - (SomaVcpf mod 11);
if DpVcpf = 10 then
Digito := ´0´;
if DpVcpf < 10 then
Digito := IntToStr(DpVcpf);
CpfNew := CpfNew + Digito;
MultVcpf := 2;
SomaVcpf := 0;
for lk := 10 downto 1 do
begin
SomaVcpf := SomaVcpf + (MultVcpf * StrToInt(Copy(CpfNew,lk,1)));
MultVcpf := MultVcpf + 1;
end;
DpVcpf := 11 - (SomaVcpf mod 11);
if DpVcpf = 10 then
Digito := ´0´;
if DpVcpf < 10 then
Digito := IntToStr(DpVcpf);
CpfNew := CpfNew + Digito;
if CpfNew = ParVcpf then
Result := ´V´
else begin
Result := ´F´
end;
end;[/b:24fad05e57]
Para checar um CPF faça assim:
[b:24fad05e57]if VCpf(Edit.Text) = ´V´ then
....vá para o passo seguinte.....
else
.... Mostra mensagem que o CPF é inválido e volta pedir outro número...[/b:24fad05e57]
Mesmo estando incompleto o número do CPF ou estando vazia a Edit, a checagem é feita e nesse caso é dado como CPF inválido.
Veja a linha da função que tem uma observação.
Nela condicionei que se o CPF não tiver 11 dígitos ou se for 11 zeros ou 11 noves, é dado como inválido e já nem vai calcular os DVs.
Você pode alterar a seu gosto.
Teste aí, faça as adaptações que lhe convir e se servir, ótimo.
Abraços
Eu não tenho problema quanto a validação do CPF.
Montei uma função e funciona bem, até para números incompletos do CPF, meu problema é que uso o Enter para passar de Edits, e no evento OnExit da Edit onde digito o CPF, manda para a função de validação antes de me pedir os dados da Edit seguinte.
Como a primeira Edit de meu form é a que pede o CPF, quando quero voltar para a tela anterior e clico num BOTÃO VOLTAR, antes de voltar a checagem do CPF é feita, mesmo com a Edit vazia, dando a mensagem que o CPF é inválido.
Eu queria que quando eu clicasse no Botão Voltar, a checagem não fosse feita, não porque a Edit estivesse vazia, mas sim porque cliclei no botão.
E isso não consegui fazer ainda.
Minha função de validação de CPF não está dando erro, e se quiser testa-la, ai abaixo vai o código:
[b:24fad05e57]function VCpf(ParVcpf : string) : string;
var
CpfNew : String;
MultVcpf : Integer;
SomaVcpf : Integer;
lk : Integer;
DpVcpf : Integer;
Digito : String;
begin
if (length(trim(ParVcpf))<> 11) or (ParVcpf=´00000000000´) or (ParVcpf=´99999999999´) then [color=red:24fad05e57]//observe esta linha[/color:24fad05e57]
begin
Result := ´F´;
Exit;
end;
CpfNew := Copy(ParVcpf,1,9);
MultVcpf := 2;
SomaVcpf := 0;
for lk := 9 downto 1 do
begin
SomaVcpf := SomaVcpf + (MultVcpf * StrToInt(Copy(CpfNew,lk,1)));
MultVcpf := MultVcpf + 1;
end;
DpVcpf := 11 - (SomaVcpf mod 11);
if DpVcpf = 10 then
Digito := ´0´;
if DpVcpf < 10 then
Digito := IntToStr(DpVcpf);
CpfNew := CpfNew + Digito;
MultVcpf := 2;
SomaVcpf := 0;
for lk := 10 downto 1 do
begin
SomaVcpf := SomaVcpf + (MultVcpf * StrToInt(Copy(CpfNew,lk,1)));
MultVcpf := MultVcpf + 1;
end;
DpVcpf := 11 - (SomaVcpf mod 11);
if DpVcpf = 10 then
Digito := ´0´;
if DpVcpf < 10 then
Digito := IntToStr(DpVcpf);
CpfNew := CpfNew + Digito;
if CpfNew = ParVcpf then
Result := ´V´
else begin
Result := ´F´
end;
end;[/b:24fad05e57]
Para checar um CPF faça assim:
[b:24fad05e57]if VCpf(Edit.Text) = ´V´ then
....vá para o passo seguinte.....
else
.... Mostra mensagem que o CPF é inválido e volta pedir outro número...[/b:24fad05e57]
Mesmo estando incompleto o número do CPF ou estando vazia a Edit, a checagem é feita e nesse caso é dado como CPF inválido.
Veja a linha da função que tem uma observação.
Nela condicionei que se o CPF não tiver 11 dígitos ou se for 11 zeros ou 11 noves, é dado como inválido e já nem vai calcular os DVs.
Você pode alterar a seu gosto.
Teste aí, faça as adaptações que lhe convir e se servir, ótimo.
Abraços
GOSTEI 0