O que há de errado com este código? O login não funciona

Delphi

19/06/2003

Veja este código.
[color=green:d71f9b0096][/color:d71f9b0096]
[color=green:d71f9b0096]procedure TfrmLogin.btOkClick(Sender: TObject);
begin
with Dm.Senha do begin
Close;
Sql.Clear;
Sql.Add(´select * from senha where usuario =:usu and senha =:sen´);
parambyname(´usu´).asstring:=edUsu.text;
parambyname(´sen´).asstring:=edSenha.text;
open;
frmPricipal.Caption:=´Usuário: ´+Dm.SenhaUsuario.AsString;
end;

if (Dm.SenhaUsuario.Value<>´´) and (Dm.SenhaSenha.Value<>´´) and (Dm.SenhaStatus.Value<>´A´) then begin
frmPricipal.btSenha.Visible:=True;

Dm.Senha.Close;
Dm.Senha.Sql.Clear;
Dm.Senha.Sql.Add(´select * from senha´);
Dm.Senha.open;

edUsu.Text:=´´;
edSenha.Text:=´´;
close;
end else begin
cont:=cont-1;
showmessage(´Você não está cadastrado!´+#13+10+´Você tem mais´+inttostr(cont)+´ chances´);
edUsu.SetFocus;
if cont = 0 then begin
showmessage(´Suas chances se esgotaram!´);
application.terminate;
end;
end;
end;

procedure TfrmLogin.edSenhaExit(Sender: TObject);
begin
btOk.Click;
end;[/color:d71f9b0096]
Oque está acontecendo? Quando o usuário entra com a senha errada, ele informa que está errada, mas permite o login no sistema. Por teste, eu fiz que o usuário, tenha um privilégio, o btSenha, torna-se visivel. Se entrar com a senha errada, ele não fica visivel, isto está certo, mas ele não devia logar, pois eu dei um setfocus, caso a senha ou usuário fossem erradas e criei uma variavel global cont e no oncreate fiz cont:=3, e em cada sessão de log, eu decremento em um, para q se o suario errar 3 vezes, eu dou um Application.Terminate e fim. Só q nada funciona, Podem-me ajudar?


Paulo

Paulo

Curtidas 0

Respostas

Davicdc

Davicdc

19/06/2003

O codigo nao ta complicado, porem se voce disser qual é cada componente, facilitaria para eu te ajudar.
tente a oportunidade de fazer com uma Ttable usando ao inves de sql, delphi. Provavelmente voce terá mais sucesso.
Isso é tudo que posso te dizer antes de saber o que é cada componente, igual esse dm. que componente é esse?


GOSTEI 0
4_olho

4_olho

19/06/2003

Vamos estudar por partes, pois depois de uma rápida olhada, achei algumas coisas estranhas ...

Acompanhe :

[color=green:b6343bf421]procedure TfrmLogin.btOkClick(Sender: TObject);
begin
with Dm.Senha do begin
Close;
Sql.Clear;
Sql.Add(´select * from senha where usuario =:usu and senha =:sen´);
parambyname(´usu´).asstring:=edUsu.text;
parambyname(´sen´).asstring:=edSenha.text;
open;
frmPricipal.Caption:=´Usuário: ´+Dm.SenhaUsuario.AsString;
end;

[b:b6343bf421]Aqui você selecionou todos os usuários que batem com a identificação e senha digitados. Portanto podemos ter UM ou NENHUM resultado, certo ?[/b:b6343bf421]

if (Dm.SenhaUsuario.Value<>´´) and (Dm.SenhaSenha.Value<>´´) and (Dm.SenhaStatus.Value<>´A´) then begin
frmPricipal.btSenha.Visible:=True;

Dm.Senha.Close;
Dm.Senha.Sql.Clear;
Dm.Senha.Sql.Add(´select * from senha´);
Dm.Senha.open;

edUsu.Text:=´´;
edSenha.Text:=´´;
close;

[b:b6343bf421]Aqui você verificou que se tem UM resultado, aparece um botão, a query é limpa e os edits também.[/b:b6343bf421]

end else begin
cont:=cont-1;
showmessage(´Você não está cadastrado!´+#13+10+´Você tem mais´+inttostr(cont)+´ chances´);
edUsu.SetFocus;
if cont = 0 then begin
showmessage(´Suas chances se esgotaram!´);
application.terminate;
end;
end;

[b:b6343bf421]Onde você inicializa [u:b6343bf421]cont [/u:b6343bf421]? Ela é uma variável global ? Se não estiver inicializada, cont:= cont-1 vai dar um número qualquer, dificilmente será ZERO, daí a sua instrução seguinte não vai pegar nada.[/b:b6343bf421]
end;

procedure TfrmLogin.edSenhaExit(Sender: TObject);
begin
btOk.Click;
end;[/color:b6343bf421]

Se você percorrer seu código usando F8 ou F7, verá que a instrução

if cont = 0 then begin
showmessage(´Suas chances se esgotaram!´);
application.terminate;
end;

nunca será executada, daí a razão do usuário conseguir rodar sua aplicação.

Outra coisa, por quê não coloca todo o código de btOKClick em EdSenhaExit ? Você usa btOKClick em outro local ?

[b:b6343bf421][color=red:b6343bf421]AVISO ao davicdc[/color:b6343bf421][/b:b6343bf421]

DM não é um componente, mas o nome de um DataModule, onde são colocadas as tabelas, querys, etc ...


GOSTEI 0
Paulo

Paulo

19/06/2003

Olá 4_Olho, cont é inicializada no evento OnCreate. Porem, eu tenho esta mesma rotina em todas as aplicações q faço. A diferença, está em q nas outras aplicações, eu utilizo mais uma query q é a conta do usuário, e nesta eu resolvi colocar botões, pois eu mudei o Design de minhas aplicações, tirando os Menus e Colocando Botões. O evento edSenha, já possui os códigos do btOk(btOk.Click). Está muito estranho.


GOSTEI 0
Paulo

Paulo

19/06/2003

Olá 4_Olho, cont é inicializada no evento OnCreate. Porem, eu tenho esta mesma rotina em todas as aplicações q faço. A diferença, está em q nas outras aplicações, eu utilizo mais uma query q é a conta do usuário, e nesta eu resolvi colocar botões, pois eu mudei o Design de minhas aplicações, tirando os Menus e Colocando Botões. O evento edSenha, já possui os códigos do btOk(btOk.Click). Está muito estranho.


GOSTEI 0
POSTAR