Detectar click num botão

Delphi

01/12/2007

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


Cps.art

Cps.art

Curtidas 0

Respostas

Daykas

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

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.


GOSTEI 0
Renan.cb

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

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.


GOSTEI 0
Facc

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

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.


GOSTEI 0
Renan.cb

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.


GOSTEI 0
Cps.art

Cps.art

01/12/2007

É verdade Renan, o evento da Edit é OnExit e não OnClose.
Confundi na postagem da mensagem.

Obrigado


GOSTEI 0
Aeciovc

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

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.


GOSTEI 0
Dedi

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.


GOSTEI 0
Cps.art

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 0
Mano_froids

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

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

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


GOSTEI 0
Cps.art

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


GOSTEI 0
POSTAR