Utilizando tela de login

Veja neste artigo de Everson Volaco, como criar uma tela de login, com usuários cadastrados no servidor do banco de dados.

Neste artigo veremos como criar uma tela de login para validar o acesso as nossas aplicações Delphi. A idéia é implementar o arquivo dpr (arquivo de projeto) de forma a criar e carregar para o usuário apenas o formulário de login, onde, após a entra de um “usuário/senha” válido o resto da aplicação é carregada.

Nota: No exemplo deste artigo foi utilizado Delphi 7 com banco de dados InterBase.

Exemplo

Inicie uma nova aplicação Delphi (File|New|Application), altere o nome do form1 para FrmPrincipal e salve a unit como untFrmPrincipal. Para o arquivo de projeto de o nome de login.dpr. Crie um novo formulário (File|New|Form), altere o nome para FrmLogin e salve a unit como untFrmLogin. O formulário FrmPrincipal será o "form main" de nossa aplicação. Para que o usuário tenha acesso ao formulário FrmPrincipal, ele terá que passar pelo formulário de Login (FrmLogin) que será criado e mostrado na tela no momento em que a aplicação for iniciada. Selecione o form FrmLogin e adicione alguns componentes visuais.

Nota: Ao alterar a propriedade ModalResult para mrCancel, não há necessidade de implementar o evento OnClick do botão btnSair para fechar o formulário, pois o Delphi faz isto automaticamente.

Antes de implementar o evento OnClick do botão btnEntrar, declare uma variável de nome tentativas na seção Private da unit untFrmLogin:

private tentativas: Smallint;

Utilizaremos está variável para contar o número de tentativas do usuário de efetuar o login na aplicação. Caso o usuário tente logar na aplicação três vezes consecutivas sem sucesso, a aplicação será fechada. Para o evento OnClick do botão btnEntrar digite o seguinte código:

procedure TFrmLogin.btnEntrarClick(Sender: TObject); begin if (edtUsuario.Text = '') then //Verifica se o campo "Usuário" foi preenchido begin Messagedlg('O campo "Usuário" deve ser preenchido!', mtInformation, [mbOk], 0); if edtUsuario.CanFocus then edtUsuario.SetFocus; Exit; end; if (edtSenha.Text = '') then //Verifica se o campo "Senha" foi preenchido begin Messagedlg('O campo "Senha" deve ser preenchido!', mtInformation, [mbOk], 0); if edtSenha.CanFocus then edtSenha.SetFocus; Exit; end; if loginValido(edtUsuario.Text, edtSenha.Text) then //Verifica se o login é válido ModalResult := mrOk else //Caso o login não seja válido então begin inc(tentativas); //Incrementa em 1 o valor da variável tentativas if tentativas < 3 then begin MessageDlg(Format('Tentativa %d de 3', [tentativas]), mtError, [mbOk], 0); if edtSenha.CanFocus then edtSenha.SetFocus; end else begin MessageDlg(Format('%dª tentativa de acesso ao sistema.', [tentativas]) + #13 + 'A aplicação será fechada!', mtError, [mbOk], 0); ModalResult := mrCancel; end; end; end;

Não se preocupe por enquanto com o método loginValido, iremos implementá-lo daqui a pouco. Repare que utilizamos a variável tentativas para armazenar o número de vezes que a função loginValido retornou False, onde, quando o valor for igual a 3 encerramos a aplicação.

Nota: Você pode, além de encerrar a aplicação bloquear o login do usuário no banco de dados, onde, apenas o administrador do aplicativo poderá desbloqueá-lo.

Caso a função loginValido retorne True, passamos o valor mrOk para a propriedade ModalResult do form FrmLogin. Quando o Delphi executar está linha, automaticamente o form FrmLogin é fechado e a aplicação volta para o lugar onde foi feito a chamada ao método ShowModal do formulário. Antes de implementar o método loginValido e fazer a chamada ao form de Login devemos criar o banco de dados que armazenará os logins para a entrada no aplicativo. Abra o IBConsole (Ferramenta gráfica que acompanha o Interbase) e crie um novo banco de dados chamado LOGIN.IB.

Abra a janela ISQL (Tools|Interactive SQL...) e entre com as seguintes instruções SQL para criação da tabela de usuários e inserção de alguns logins de exemplo:

/*Cria a tabela USUARIO que irá armazenar os logins válidos para acesso ao aplicativo*/ CREATE TABLE USUARIO (USU_ID INTEGER NOT NULL, USU_NOME VARCHAR(40) NOT NULL, USU_SENHA VARCHAR(40) NOT NULL, CONSTRAINT PK_USUARIO PRIMARY KEY (USU_ID)); /*Insere três logins de exemplo na tabela USUARIO*/ INSERT INTO USUARIO (USU_ID, USU_NOME, USU_SENHA) VALUES (1, 'CLUBEDELPHI', 'delphi'); INSERT INTO USUARIO (USU_ID, USU_NOME, USU_SENHA) VALUES (2, 'BORLAND', 'borland'); INSERT INTO USUARIO (USU_ID, USU_NOME, USU_SENHA) VALUES (3, 'EVERSON', 'everson'); /*Aplica os comandos efetivamente no banco de dados*/ COMMIT

Volte a aplicação Delphi e crie um Data Module (File|New|Data Module) para armazenarmos os componentes que farão o acesso ao banco de dados LOGIN.IB. Altere sua propriedade Name para DMPrincipal e salve a unit como untDMPrincipal. Adicione um componente SQLConnection (DBExpress) e um SQLDataSet (DBExpress) ao DMPrincipal.

Nota: Você pode utilizar o botão Test Connection para testar a conexão com o banco de dados.

Na chave Database você deve informar o caminho completo do banco de dados LOGIN.IB. Caso você tenha criado o banco de dados no mesmo diretório da aplicação, basta entrar com o nome do banco como mostra a figura.

Nota: A instrução SQL que será passada na propriedade CommandText para consulta do login no banco de dados ficará a cargo do método loginValido que montará em tempo de execução.

Volte ao formulário de Login (FrmLogin) e declare a função loginValido na seção Private da unit:

private tentativas : Smallint; function loginValido(const usuario, senha: String): Boolean;

Selecione as teclas Shift+Ctrl+C, ou execute a opção Complete class at cursor a partir do menu de contexto da unit para que o Delphi crie o corpo da função loginValido na seção Implementation. Digite o seguinte código na função:

function TFrmLogin.loginValido(const usuario, senha : String) : Boolean; begin with DMPrincipal.ConLOGIN, DMPrincipal.datasetAux do begin if not Connected then //Caso o componente ConLOGIN não esteja conectado ao BD Connected := True; Close; CommandText := 'SELECT COUNT(1) FROM USUARIO ' + ' WHERE UPPER(USU_NOME) = ' + QuotedStr(AnsiUpperCase(Trim(usuario))) + ' AND USU_SENHA = ' + QuotedStr(Trim(senha)); Open; Result := (Fields[0].AsInteger > 0); end; end;

Repare que montamos a instrução SQL em tempo de execução passando o usuário e a senha informada para validação no banco de dados InterBase. Para o campo usuário fazemos a comparação passando os valores para maiúsculo, ignorando assim diferenças entre letras maiúsculas e minúsculas. No caso do campo senha passamos o valor da forma que foi informada, tornando assim o campo case-sensitive (diferenciando letras maiúsculas de minúsculas). Caso a instrução SQL retorne um valor maior que 0 é porque o usuário informou um login válido e seu acesso é liberado, caso contrário sua entrada ao aplicativo falha. Para finalizarmos nossa aplicação falta fazermos a chamada ao form de Login no momento em que a aplicação for iniciada. Abra o arquivo de projeto login.dpr (Project|View Source) e altere ele de acordo com o código abaixo:

Nota: Abaixo segue o código completo do arquivo de projeto login.dpr.
program login; uses Forms, Controls, //Declarado devido ao uso da constante mrOk SysUtils, //Declarado devido ao uso do método FreeAndNil untFrmPrincipal in 'untFrmPrincipal.pas' , untFrmLogin in 'untFrmLogin.pas' , untDMPrincipal in 'untDMPrincipal.pas' {DMPrincipal: TDataModule}; {$R *.res} begin Application.Initialize; Application.CreateForm(TDMPrincipal, DMPrincipal); Application.CreateForm(TFrmLogin, FrmLogin); if FrmLogin.ShowModal = mrOk then //Caso o retorno da tela seja Ok begin FreeAndNil(FrmLogin); //Libera o form de Login da memória Application.CreateForm(TFrmPrincipal, FrmPrincipal); //Cria a janela main Application.Run; //Roda a aplicação end else //Caso o retorno da tela de Login seja mrCancel então Application.Terminate; //Encerra a aplicação end.

Repare que ao iniciar a aplicação fazemos apenas a criação do DMPrincipal e do FrmLogin. Caso o retorno do form FrmLogin seja mrOk (login válido) criamos o form FrmPrincipal e carregamos a aplicação. Rode a aplicação (F9) e teste a tela de login passando os usuários que cadastramos na tabela USUARIO do banco de dados LOGIN.IB no InterBase.

Conclusão

Vimos que a criação e manipulação de uma tela de login para validação da entrada dos usuários a nossa aplicação Delphi é bastante simples. Você pode ainda salvar as senhas dos usuários de forma criptografada no banco de dados, adicionando assim mais segurança ao acesso a sua aplicação.

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados