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.
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.
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.
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.
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.
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:
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.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo