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.

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

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

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.