Fórum Erro ao sair do sistema #403342

18/06/2011

0

estou abrindo um novo tópico pois não consigo responder no original...

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

Emerson Nascimento

Responder

Posts

19/06/2011

Frederico Brigatte***

estou abrindo um novo tópico pois não consigo responder no original...

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.
Responder

Gostei + 0

20/06/2011

Emerson Nascimento

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

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;



Responder

Gostei + 0

20/06/2011

Wilson Junior

Responder

Gostei + 0

20/06/2011

Emerson Nascimento

é sim. esse aí é o tópico original. porém é impossível responder nele.
por isso criei este outro.
Responder

Gostei + 0

20/06/2011

Frederico Brigatte***

é sim. esse aí é o tópico original. porém é impossível responder nele.
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.
Responder

Gostei + 0

21/06/2011

Emerson Nascimento

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

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 ?
Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

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?
Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

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
Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

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.
Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

ok. pelo que eu entendi no seu código, você quer que quando a tela de login apareça, a tela principal desapareça. é isso mesmo? porque se for assim, você poderia apenas escondê-la, e não eliminá-la.

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.

Responder

Gostei + 0

21/06/2011

Emerson Nascimento

isso deve acontecer porque seu frmprincipal não está marcado como formulário principal da aplicação.


se você puder me passar seu projeto, com essas três units (principal, login, dm), posso tentar resolver o problema.

emerson.en@gmail.com


Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

isso deve acontecer porque seu frmprincipal não está marcado como formulário principal da aplicação.


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.
Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

isso deve acontecer porque seu frmprincipal não está marcado como formulário principal da aplicação.


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.
Responder

Gostei + 0

21/06/2011

Emerson Nascimento

fiz exatamente como no exemplo que eu te passei.

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.
Responder

Gostei + 0

21/06/2011

Frederico Brigatte***

fiz exatamente como no exemplo que eu te passei.

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?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar