Utilizando tela de login

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (15)  (0)

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 como mostra a Figura 1.

 

Figura 1. Tela de login em tempo de designer

- Altere a propriedade PasswordChar do componente edtSenha para *. Desta forma, o texto digitado dentro do campo aparecerá como asterisco na tela.

Obs. A propriedade PasswordChar afeta apenas a aparência do componente edtSenha. O valor da propriedade Text reflete o texto digitado dentro do componente.

- Para o botão btnEntrar altere sua propriedade Default para True. Desta forma, quando o usuário pressionar na tecla Enter, o evento OnClick deste botão será executado (mesmo que o foco não esteja no botão).

- Com o botão btnSair selecionado, altere sua propriedade ModalResult para mrCancel. Quando o usuário pressionar o botão btnSair, a tela de Login será fechada e a constante mrCancel será passada como resultado do método ShowModal do formulário.

 

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 como mostra a Figura 2.

 

Figura 2. Criando o banco de dados LOGIN.IB no InterBase

 

Nota: Você pode baixar uma versão de avaliação do InterBase a partir do link

http://www.borland.com/products/downloads/download_interbase.html.

 

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.

 

- Selecione o componente SQLConnection e altere sua propriedade name para ConLOGIN.

- Acesse a opção Edit Connection Properties a partir do menu de contexto do componente ConLOGIN para acessar a janela de conexões do dbExpress. Clique no botão Add Connection e crie uma nova conexão como mostra a Figura 3.

 

Figura 3. Criando a conexão para acesso ao banco de dados LOGIN.IB

 

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.

- Ainda com o ConLOGIN selecionado, altere sua propriedade LoginPrompt para False. Como nós já indicamos a senha (masterkey) que será passada ao InterBase para conexão ao banco de dados LOGIN.IB, não precisamos mostrar a janela de login do InterBase.

- Selecione o componente SQLDataSet e altere sua propriedade Name para datasetAux.

- Aponte sua propriedade SQLConnection para o componente ConLOGIN.

 

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' {FrmPrincipal},

   untFrmLogin in 'untFrmLogin.pas' {FrmLogin},

   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. Veja a aplicação em execução na Figura 4.

 

Figura 4. Aplicação de exemplo em tempo de execução

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.

Um abraço e até a próxima.

 

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Ficou com alguma dúvida?