Erro ao sair do sistema
primeiro:
para melhorar a segurança, NÃO avalie usuário e senha separadamente.
avaliar em conjunto dificulta o quebra via força-bruta, pois não dá pra saber o que foi digitado errado.
então sugiro que você mude sua avaliação para:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
var
ValorSenha: TstringField;
begin
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
frmPrincipal.close;
ednome.setfocus;
Exit;
end;
ValorSenha:=DM.tableUsers.findfield('Senha') as tStringfield;
frmPrincipal.label2.Caption := frmLogin.EdNome.Text;
frmPrincipal.enabled:=true;
frmlogin.release;
end;
segundo:
qual é o form principal da sua aplicação?
esta informação é essencial para poder te oferecer uma solução adequada.
Emerson Nascimento
Respostas
Frederico Brigatte***
18/06/2011
primeiro:
para melhorar a segurança, NÃO avalie usuário e senha separadamente.
avaliar em conjunto dificulta o quebra via força-bruta, pois não dá pra saber o que foi digitado errado.
então sugiro que você mude sua avaliação para:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
var
ValorSenha: TstringField;
begin
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
frmPrincipal.close;
ednome.setfocus;
Exit;
end;
ValorSenha:=DM.tableUsers.findfield('Senha') as tStringfield;
frmPrincipal.label2.Caption := frmLogin.EdNome.Text;
frmPrincipal.enabled:=true;
frmlogin.release;
end;
segundo:
qual é o form principal da sua aplicação?
esta informação é essencial para poder te oferecer uma solução adequada.
Ok, desculpe pela demora, estava arrumando minha máquina. O Form Principal é o frmPrincipal.
Emerson Nascimento
18/06/2011
então eu faria assim:
no DPR (adicione Controls na uses):
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
no FrmLogin:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
try
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
begin
Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
ModalResult := mrCancel;
end
else
ednome.setfocus;
end
else
begin
frmPrincipal.label2.Caption := edNome.Text;
ModalResult := mrOk;
end;
except
// caso haja qualquer erro na avalição, sai do sistema
// para evitar acesso indevido
ModalResult := mrCancel;
end;
end;
no FrmPrincipal:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
Self.Visible := False;
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Self.Visible := True
else
Self.Close;
end;
Wilson Junior
18/06/2011
Emerson Nascimento
18/06/2011
por isso criei este outro.
Frederico Brigatte***
18/06/2011
por isso criei este outro.
Vc conseguiu detectar o erro? O problema é quando logo com o segundo usuário, ao clicar em sair da o erro.
Emerson Nascimento
18/06/2011
então eu faria assim:
no DPR (adicione Controls na uses):
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
no FrmLogin:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
try
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
begin
Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
ModalResult := mrCancel;
end
else
ednome.setfocus;
end
else
begin
frmPrincipal.label2.Caption := edNome.Text;
ModalResult := mrOk;
end;
except
// caso haja qualquer erro na avalição, sai do sistema
// para evitar acesso indevido
ModalResult := mrCancel;
end;
end;
no FrmPrincipal:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
Self.Visible := False;
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Self.Visible := True
else
Self.Close;
end;
você testou com as alterações acima ?
Frederico Brigatte***
18/06/2011
então eu faria assim:
no DPR (adicione Controls na uses):
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
no FrmLogin:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
try
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
begin
Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
ModalResult := mrCancel;
end
else
ednome.setfocus;
end
else
begin
frmPrincipal.label2.Caption := edNome.Text;
ModalResult := mrOk;
end;
except
// caso haja qualquer erro na avalição, sai do sistema
// para evitar acesso indevido
ModalResult := mrCancel;
end;
end;
no FrmPrincipal:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
Self.Visible := False;
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Self.Visible := True
else
Self.Close;
end;
você testou com as alterações acima ?
Vou fazer agora, um momento, ok?
Frederico Brigatte***
18/06/2011
então eu faria assim:
no DPR (adicione Controls na uses):
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
no FrmLogin:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
try
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
begin
Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
ModalResult := mrCancel;
end
else
ednome.setfocus;
end
else
begin
frmPrincipal.label2.Caption := edNome.Text;
ModalResult := mrOk;
end;
except
// caso haja qualquer erro na avalição, sai do sistema
// para evitar acesso indevido
ModalResult := mrCancel;
end;
end;
no FrmPrincipal:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
Self.Visible := False;
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Self.Visible := True
else
Self.Close;
end;
você testou com as alterações acima ?
Vou fazer agora, um momento, ok?
Tá dando erro nessa linha:
if FrmLogin.ShowModal = mrOk then
Frederico Brigatte***
18/06/2011
então eu faria assim:
no DPR (adicione Controls na uses):
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
no FrmLogin:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
try
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
begin
Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
ModalResult := mrCancel;
end
else
ednome.setfocus;
end
else
begin
frmPrincipal.label2.Caption := edNome.Text;
ModalResult := mrOk;
end;
except
// caso haja qualquer erro na avalição, sai do sistema
// para evitar acesso indevido
ModalResult := mrCancel;
end;
end;
no FrmPrincipal:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
Self.Visible := False;
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Self.Visible := True
else
Self.Close;
end;
você testou com as alterações acima ?
Vou fazer agora, um momento, ok?
Tá dando erro nessa linha:
if FrmLogin.ShowModal = mrOk then
Deu erro agora nessa linha:
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
A uses ta assim:
program Parte2;
uses
Forms,
Controls,
UnitPrincipal in 'UnitPrincipal.pas' ,
UnitLogin in 'UnitLogin.pas' ,
UnitDM in 'UnitDM.pas' {DM: TDataModule},
UnitSenhas in 'UnitSenhas.pas' ;
{$R *.RES}
begin
// Application.Initialize;
// Application.CreateForm(TFrmPrincipal, FrmPrincipal);
// Application.CreateForm(TDM, DM);
// Application.Run;
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
Não sei mais o que fazer.
Frederico Brigatte***
18/06/2011
então eu faria assim:
no DPR (adicione Controls na uses):
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
no FrmLogin:
procedure TFrmLogin.BtnOKClick(Sender: TObject);
begin
try
if not DM.tableusers.findkey([ednome.text]) or
(DM.tableUsers.fieldbyname('Senha').value<>edsenha.text) then
begin
pnlMensagem.Caption:='Login Recusado. Usuário ou Senha inválidos...';
inc(Contador);
if contador = 4 then // alcançou o limite de tentativas
begin
Application.MessageBox('Número de tentativas esgotado. O sistema será fechado.',
'Login negado', MB_TASKMODAL + MB_OK + MB_ICONERROR);
ModalResult := mrCancel;
end
else
ednome.setfocus;
end
else
begin
frmPrincipal.label2.Caption := edNome.Text;
ModalResult := mrOk;
end;
except
// caso haja qualquer erro na avalição, sai do sistema
// para evitar acesso indevido
ModalResult := mrCancel;
end;
end;
no FrmPrincipal:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
Self.Visible := False;
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Self.Visible := True
else
Self.Close;
end;
você testou com as alterações acima ?
Vou fazer agora, um momento, ok?
Tá dando erro nessa linha:
if FrmLogin.ShowModal = mrOk then
Deu erro agora nessa linha:
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
A uses ta assim:
program Parte2;
uses
Forms,
Controls,
UnitPrincipal in 'UnitPrincipal.pas' ,
UnitLogin in 'UnitLogin.pas' ,
UnitDM in 'UnitDM.pas' {DM: TDataModule},
UnitSenhas in 'UnitSenhas.pas' ;
{$R *.RES}
begin
// Application.Initialize;
// Application.CreateForm(TFrmPrincipal, FrmPrincipal);
// Application.CreateForm(TDM, DM);
// Application.Run;
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TFrmLogin, FrmLogin);
if FrmLogin.ShowModal = mrOk then
Application.Run
else
Application.Terminate;
end.
Não sei mais o que fazer.
Fiz essas modificações e continua dando erro.
Fiz uma mudança e o erro acima sumiu:
De: Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Para: Application.CreateForm(TFrmPrincipal, FrmPrincipal);
Application.CreateForm(TDM, DM);
Ahh, e o procedimento no botão OK no FrmLogin não entra no form Principal, entro com o login e senha e fica só na tela de login.
Emerson Nascimento
18/06/2011
se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.
emerson.en@gmail.com
Frederico Brigatte***
18/06/2011
se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.
emerson.en@gmail.com
Consegue me mandar ainda hoje? Estou parado nisso.
Frederico Brigatte***
18/06/2011
se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.
emerson.en@gmail.com
Consegue me mandar ainda hoje? Estou parado nisso.
Acabei de enviar.
Emerson Nascimento
18/06/2011
só uma coisa não havia sido explicada por você:
do DM havia o seguinte código:
procedure TDM.DMCreate(Sender: TObject);
begin
frmprincipal.show;
frmLogin:=TfrmLogin.create(self);
frmlogin.show;
end;
totalmente DESnecessário. retirei do fonte.
estava meio bagunçado: os formulários eram criados e destruídos em vários locais do seu programa.
te enviei o fonte corrigido.
Frederico Brigatte***
18/06/2011
só uma coisa não havia sido explicada por você:
do DM havia o seguinte código:
procedure TDM.DMCreate(Sender: TObject);
begin
frmprincipal.show;
frmLogin:=TfrmLogin.create(self);
frmlogin.show;
end;
totalmente DESnecessário. retirei do fonte.
estava meio bagunçado: os formulários eram criados e destruídos em vários locais do seu programa.
te enviei o fonte corrigido.
Não recebi, Emerson. Pode enviar novamente?
Frederico Brigatte***
18/06/2011
só uma coisa não havia sido explicada por você:
do DM havia o seguinte código:
procedure TDM.DMCreate(Sender: TObject);
begin
frmprincipal.show;
frmLogin:=TfrmLogin.create(self);
frmlogin.show;
end;
totalmente DESnecessário. retirei do fonte.
estava meio bagunçado: os formulários eram criados e destruídos em vários locais do seu programa.
te enviei o fonte corrigido.
Não recebi, Emerson. Pode enviar novamente?
Emerson, funcionou perfeitamente. Como faço para o form principal aparecer no fundo, caso queira fazer assim?
Emerson Nascimento
18/06/2011
Frederico Brigatte***
18/06/2011
Tem como fazer para mim?
Frederico Brigatte***
18/06/2011
Tem como fazer para mim?
Ou explicar aqui como fazer que faço.
Emerson Nascimento
18/06/2011
para isso, altere apenas o procedimento do logoff, de modo a ficar assim:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
if TFrmLogin.ChamaLogin <> mrOk then
begin
lFecha := True;
Self.Close;
end;
end;
Frederico Brigatte***
18/06/2011
para isso, altere apenas o procedimento do logoff, de modo a ficar assim:
procedure TFrmPrincipal.mnuLogoffClick(Sender: TObject);
begin
if TFrmLogin.ChamaLogin <> mrOk then
begin
lFecha := True;
Self.Close;
end;
end;
Ok, caso queira que o form principal apareça de fundo no primeiro login também, dá para fazer? Essa é para encerrar.
Emerson Nascimento
18/06/2011
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
FrmPrincipal.Show; // acrescente esta linha
if TFrmLogin.ChamaLogin = mrOk then
Application.Run
else
Application.Terminate;
end.
Frederico Brigatte***
18/06/2011
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
FrmPrincipal.Show; // acrescente esta linha
if TFrmLogin.ChamaLogin = mrOk then
Application.Run
else
Application.Terminate;
end.
Ok, vou testar. Obrigado por enquanto.
Frederico Brigatte***
18/06/2011
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
FrmPrincipal.Show; // acrescente esta linha
if TFrmLogin.ChamaLogin = mrOk then
Application.Run
else
Application.Terminate;
end.
Ok, vou testar. Obrigado por enquanto.
Funcionou perfeito. Agora posso dar contiuidade. Obrigado Emerson.
Frederico Brigatte***
18/06/2011
begin
Application.Initialize;
Application.CreateForm(TDM, DM);
Application.CreateForm(TFrmPrincipal, FrmPrincipal);
FrmPrincipal.Show; // acrescente esta linha
if TFrmLogin.ChamaLogin = mrOk then
Application.Run
else
Application.Terminate;
end.
Ok, vou testar. Obrigado por enquanto.
Funcionou perfeito. Agora posso dar contiuidade. Obrigado Emerson.
Está estranho. Estou querendo fazer um perfil de usuários aqui, mas está deixando fazer com qualquer um que loga. Vc teria um exemplo ou melhorar esse?
José
18/06/2011