quarta-feira, 28 de março de 2012

E ai.. como vão?
Vou mostrar aqui um dos métodos de como funciona o login com banco de dados em delphi.
Vamos supor que eu ja tenho uma conexão. Criei um banco de dados em Access com uma tabela 'login'.
Criei uma tabela na seguinte estrutura:




Criei um DataModule e coloquei o ADOConnectio e o ADOTable la. Estou chamando o Datamodule de 'dm'.



Feita a conexão com o banco de dados (Você pode ver como é feita essa conexão com Access aqui) vamos colocar a 'mão na massa'!
Vamos criar dois formulários, o de login, e o de exibição (tela pra confirmar o login).
O formulário de login, tem a seguinte estrutura:


Vou utilizar edtUsuario para a Edit do usuario e edtSenha para a Edit da senha.

O código responsável pela verificação dos campos é o seguinte (OnClick do botão 'Entrar'):

procedure TForm1.Button1Click(Sender: TObject);
begin
  // ativa a tabela
 dm.tb_login.Open;

  // verifica se os campos coincidem,
  // tanto na tabela, quanto nas edits
 if dm.tb_login.Locate('usuario', edtUsuario.Text, [loCaseInsensitive ]) and
  dm.tb_login.Locate('senha', edtSenha.Text, [loCaseInsensitive ]) then
  begin
    // fecha a tabela
  dm.tb_login.Close();
    // mostra outro form
  Form2.Show;
    // esconde o atual
  Self.Hide;
  end
  // se os campos forem vazios
 else if (edtUsuario.Text = '') and (edtSenha.Text= '') then
       begin
         // mostra mensagem
         ShowMessage('Preencha os campos login e senha!');
       edtUsuario.SetFocus;
       end
       else  // campos nao conferem
       begin
         // campos nao conferem
         ShowMessage('Usuario ou senha inválidos!');
         edtUsuario.Clear;
         edtSenha.Clear;
       end;
end;



Vale lembrar que para a utilização das opções TLocateOptions (loPartialKey ou loCaseInsensitive) é necessário declarar a uses 'DB'.

-Entendendo o Locate

tabela.Locate('campo_da_tabela', 'texto_para_procurar', [opções_de_localização]).

O que são essas opções de localização?
Podem ser usadas loCaseInsensitive e loPartialKey.

loCaseInsensitive: Diferencia maiúsculas e minusculas, exemplo: Nome é diferente de NOME que é diferente de NoMe.
loPartialKey: Pode localizar partes de registros, exemplo: 'Progr' pode ser 'Programa' que pode ser 'Programador'.

Agora basta criar um outro Form com um Label, responsável por dar boas vindas ao usuario.
Altere o nome para lblOla. (Olá)


Altere o evento OnShow do forumlário 2 para o seguinte código:



// mostra o nome do usuario logado
  lblOla.Caption := 'Olá ' + Form1.edtUsuario.Text;


Basta executar e testar! Este código pode ser baixado aqui.
Abraço e até a próxima!



21 comentários:

  1. Anônimo19.8.12

    aqui estou com problema na parte do

    if dm.tb_login.Locate('usuario', edtUsuario.Text, [loCaseInsensitive ])
    and
    dm.tb_login.Locate('senha', edtSenha.Text, [loCaseInsensitive ]) then

    ResponderExcluir
  2. Olá, em qual linha o erro ocorre?
    Lembrando que 'dm' é o nome do DataModule e 'tb_login' é o nome do ADOTable que está no DataModule.
    Abraço

    ResponderExcluir
  3. Anônimo6.11.12

    Olá Programador!

    Como faço pra desabilirar os menus, de acordo com o grupo de usuários?

    ResponderExcluir
  4. Anônimo7.3.13

    Muito bom programador vc conhece muito

    ResponderExcluir
  5. sim e quando for mais de 5 usuariaos por exemplo ele so reconhece o primeiro ????????????

    ResponderExcluir
  6. tá, aqui tem uma página de login mas, como seria feita a pagina de registro? que tal um tutorial sobre?

    ResponderExcluir
  7. Anônimo21.8.13

    onde foi que o adoconnection funcionau no projeto?

    ResponderExcluir
  8. Tudo bem, seu está correto mas bom lembrar que para criar m login deste temos que ter primeiro a tabela de cadastro de usuário a onde será criado a o usuário e senha, ok.
    Para quem quiser trabalhar com os componentes do da aba "interbase" usando uma Query.


    O código ficaria assim.


    {procedure TForm_Login.BtnLogarClick(Sender: TObject);
    begin
    BtnLogar.Tag:=BtnLogar.Tag + 1;
    With DmDados.IBQLogin Do
    Begin
    Close;
    Sql.Clear;
    Sql.Add('SELECT * FROM tab_usuario');
    Sql.Add('Where login =:log AND senha =:Pass');
    ParamByName('Log').AsString:= EdtUsuario.Text;
    ParamByName('Pass').AsString:= EdtSenha.Text;
    open;
    IF Dmdados.IBQLogin.IsEmpty Then
    Begin
    MessageDlg('Usuário ou senha inexistente',MtError,[MbOk],0);
    EdtUsuario.Text:='';
    EdtSenha.Text:='';
    EdtUsuario.SetFocus;
    end
    else
    Begin
    Form_Login.Close;
    Frm_Principal.Show;
    end;
    IF BtnLogar.Tag = 3 THen
    Application.Terminate;
    end;


    end;}

    É mais trabalhoso, mas é uma pesquisa completa que pode ser adaptada para outras pesquisa.

    ResponderExcluir
  9. Anônimo17.11.13

    Comigo deu certinho!
    Muito obrigado era justamente o que eu buscava!
    Seu exemplo ainda esta ON para quem quiser baixar e estudar!
    Obrigado!

    ResponderExcluir
  10. Muito bem explicado e simples de aplicar. Valeuuu

    ResponderExcluir
  11. valeu cara, ajudou baste!!!

    ResponderExcluir
  12. Como faço com um banco de dados em mysql?

    ResponderExcluir
  13. Como faço com um banco de dados em mysql?

    ResponderExcluir
  14. O meu funcionou teoricamente. Ele verifica o login e senha mas se existirem em qualquer registro o form principal abre. Não está amarrando o usuario e senha do mesmo registro.

    ResponderExcluir
  15. Boa Tarde

    O exemplo funcionou parcialmente pra mim,

    Faz a verificação no banco, mas se houver o usuario e senha em qualquer registro valida o login.

    Ex: Registro 1: Usuario = Daniel - Senha = 123456
    Registro 2: Usuario = Ana - Senha = 123

    Se digito usuario de um registro e senha de outro o login é aceito.

    Como resolver?

    ResponderExcluir
  16. Anônimo16.9.16

    blz, só que esta reconhecendo somente 1º registro da tabela...2º em diante não abre. O que eu faço?

    ResponderExcluir
  17. Anônimo14.4.17

    o meu esta dando erro aqui dm.tb_login.Locate('usuario', edtUsuario.Text, [loCaseInsensitive ])

    ResponderExcluir
  18. Este comentário foi removido pelo autor.

    ResponderExcluir
  19. Este comentário foi removido pelo autor.

    ResponderExcluir
  20. boa noite pessoal. me ajudem se poderem por favor. criei uma tabela de login
    no delphi 7. esta programada que quando a senha for digitada errada pela 1 vez aparece a mensagem você errou a senha e tem mais uma chance. mas mesmo assim errada entra na tela principal. e se fosse digitada a 2 vez
    era pra fechar mas nao aparece pra digitar a senha e estando errada e pra fechar o sistema. aqui esta o algoritimo
    unit ULogin;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, db;

    type
    TfrmUsuario = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Edit1Exit(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);

    private
    tentou :integer;
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    frmUsuario: TfrmUsuario;

    implementation

    uses Udm_dados;

    {$R *.dfm}

    procedure TfrmUsuario.Edit1Exit(Sender: TObject);
    begin
    if not (dm_dados.tbl_usuario.Locate('usu_login',Edit1.Text,
    [lopartialkey,locaseinsensitive])) then
    begin
    showmessage('login inexistente');
    edit1.SetFocus;
    end;

    end;

    procedure TfrmUsuario.FormShow(Sender: TObject);
    begin
    dm_dados.tbl_usuario.Open;
    tentou:=0;
    end;

    procedure TfrmUsuario.Button1Click(Sender: TObject);
    begin
    if edit2.Text = dm_dados.tbl_usuarioUSU_SENHA.Value then
    showmessage('Ola '+dm_dados.tbl_usuarioUSU_NOME.value+', Bem vindo ao Sistema, bom trabalho')
    else

    begin
    inc(tentou); // e o mesmo que tentou:=tentou+1;
    if tentou = 1 then

    showmessage('Você errou a senha, voce tem mais uma chance pra acessar o sistema')
    else

    begin
    showmessage('Você errou a senha, voce nao tem permissao pra acessar o sistema!');
    close;
    end;

    end;

    end;

    end.

    ResponderExcluir
  21. Anônimo29.11.22

    Não sei se ainda está funcionando este site,mas tenho uma dúvida. Como criar um exibir registros somente do usuário logado?

    ResponderExcluir