versão para impressão_ poo e dao pattern no delphi_ criando uma tela de login
TRANSCRIPT
-
www.devmedia.com.br [verso para impresso]
POO e DAO Pattern no Delphi: Criando uma tela de loginVeja neste artigo como utilizar de maneira prtica assuntos como ProgramaoOrientada a Objetos, DAO Pattern, e o framework DbExpress 4, assuntos muitoimportantes dentro da comunidade Delphi.
Introduo
A POO (Programao Orientada a Objetos), cujos pilares bsicos so: Herana, Polimorfimo eEncapsulamento, uma metodologia inteligente de desenvolvimento de software, que visa tornar ossistemas mais flexiveis a mudanas, fceis de manter, e permite uma grande reutilizao de cdigo.
Um dos problemas encontrados em sistemas escritos de maneira procedural a descentralizao deresponsabilidades (regras de negcio misturadas a camada de apresentao), onde o mesmo cdigoaparece repetidas vezes em diferentes pontos do sistema, tornando o custo de manuteno cada vezmaior. No so raros os casos de empresas que precisaram reescrever sistemas do zero por taisproblemas.
Para corrigir este problema, podemos utilizar a POO em conjunto com o Design Pattern DAO.
O Padro DAO (Data Access Object) um pattern que permite separar acesso a dados e regras denegcio da camada de apresentao, centralizando as responsabilidades de manipulao do banco dedados e facilitando a manuteno.
Neste tutorial criaremos um sistema simples de Login, utilizando conceitos de programao orientada aobjetos e separao de camadas com DAO Pattern, utilizando a linguagem e IDE Delphi.
O Delphi uma linguagem de alto nvel, compilada, fortemente tipada, que suporta os paradigmas deprogramao estruturada e orientada a objetos, sendo uma excelente ferramenta de desenvolvimento.
Para esse artigo foi utilizado o Delphi XE e banco de dados Firebird 2.5
Criao do Projeto
Crie um novo diretrio, onde sero salvos o Banco de Dados (caso use firebird/interbase) e os arquivosdo Projeto.
Utilizando o Banco de Dados e o Front End de sua preferncia, crie um novo banco e execute os scriptsabaixo para criao da tabela Usuarios, e o usuario administrador, respectivamente:
Listagem 1: Scripts do Banco de Dados
// Criao da tabela USUARIOSCREATE TABLE USUARIOS( CODIGO INTEGER NOT NULL, USUARIO VARCHAR(20) NOT NULL, SENHA VARCHAR(20) NOT NULL,CONSTRAINT PK_USUARIOS PRIMARY KEY (CODIGO))
// INSERT do primeiro Usuario da tabelaINSERT INTO USUARIOS (CODIGO, USUARIO, SENHA) VALUES (1,administrador,admin123)
Utilizando o Delphi, crie um novo projeto no Menu New -> VCL Forms Application Delphi.
Adicione uma nova Unit ao projeto no Menu New -> Unit Delphi.
Iremos utilizar a nova Unit para criao da classe TLoginModel, que ser responsvel por transferirinformaes entre a camada de negcios e a camada de apresentao.
A classe TLoginModel possui dois campos, que so: FUsuario e FSenha.
Respeitando as boas prticas de POO, no iremos expor publicamente nossos campos, mas iremos
Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112
1 de 5 24/05/2013 13:56
-
encapsular o acesso a eles utilizando mtodos getters, setters e propriedades.
Listagem 2: Class TLoginModel
unit uLoginModel;
interface Type TLoginModel = class strict private // campos FUsuario: string; FSenha: string;
// getters function GetUsuario: string; function GetSenha: string;
// setters procedure SetUsuario(const Value: string); procedure SetSenha(const Value: string);
public // propriedades property Usuario : string read GetUsuario write SetUsuario; property Senha : string read GetSenha write SetSenha; end;
implementation
{ TLoginModel }
function TLoginModel.GetSenha: string;begin Result := FSenha;end;
function TLoginModel.GetUsuario: string;begin Result := FUsuario;end;procedure TLoginModel.SetSenha(const Value: string);begin FSenha := Value;end;
procedure TLoginModel.SetUsuario(const Value: string);begin FUsuario := Value;end;end.
Volte ao formulrio da aplicao e altere a propriedade Name para frmLogin.
Utilizando a Tool Palette, adicione os seguintes controles:
3 Labels;2 Edits;2 Buttons.
Altere a propriedade Name dos controle para:
3 Labels (lblTitulo, lblUsuario, lblSenha);2 Edits (edtUsuario, edtSenha);2 Buttons (btnLogar, btnSair);
Organize o formulrio e altere a propriedade Caption dos controle conforme a imagem abaixo:
Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112
2 de 5 24/05/2013 13:56
-
Figura 1: Formulrio frmLogin
Utilizando o menu New, adicione um Data Module ao seu projeto.
Adicione um controle do tipo SQLConnection da paleta DbExpress, que ser usado para criar umaconexo com o Banco de Dados.
Configure o controle SQLConnection de acordo de o caminho do seu banco.
Defina a propriedade LoginPrompt como False para que a senha do banco no seja solicitadanovamente a cada nova conexo.
Altere a propriedade Name do Data Module para dm_dados e a propriedade Name SQLConnection paraLOGINOO.
Salve o projeto e as units no diretrio criado no incio do artigo, seguindo a nomenclatura:
Formulrio Login - uFrmLogin;Unit Login Model - uLoginModel;Data Module - uDm_Dados;Nome do Projeto LOGINOO;
Inclua uma nova Unit no Menu New -> Unit Delphi.
Salve a nova Unit criada como uLoginDAO.
A classe TLoginDAO ser usada para centralizar as regras de negcio e o acesso ao banco de dados.
Para nossa classe TLoginDAO, utilizaremos mtodos do framework DbExpress 4, que a engine deacesso e manipulao de dados mais utilizada pelos programadores Delphi.
A nova arquitetura do DbExpress 4 traz novas features que permitem um desenvolvimento totalmenteorientado a objetos, de maneira simples e elegante.
Digite as informaes da classe TLoginDAO, e no esquea de dar uses nas Units uLoginModel,DBXCommon, SysUtils.
Listagem 3: Classe TLoginDAO
Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112
3 de 5 24/05/2013 13:56
-
unit uLoginDAO;
interface
uses uLoginModel, DBXCommon, SysUtils;
type TLoginDAO = class
public // funo Logar passando um objeto LoginModel como parmetro function Logar(LoginModel: TLoginModel): Boolean; end;
implementation
uses
Dialogs;
{ TLoginDAO }
function TLoginDAO.Logar(LoginModel: TLoginModel): Boolean; var
dbcon : TDBXConnection; // objeto para conexao sql : TDBXCommand; // objeto para executar instruoes SQL parametro : TDBXParameter; // objeto para parametrizar instruao SQL reader : TDBXReader; // objeto que guarda o resultado de um TDBXCommand;begin try try
// fabrica uma conexo com o banco dbcon:=TDBXConnectionFactory.GetConnectionFactory.GetConnection('LOGINOO', 'sysdba','masterkey'); // cria um comando sql no objeto dbcon sql := dbcon.CreateCommand; // instruo SQL sql.Text := 'SELECT * FROM USUARIOS WHERE UPPER(USUARIO) = UPPER(?) ' + ' AND UPPER(SENHA) = UPPER(?)';
// parametro Usuario parametro := sql.CreateParameter; parametro.DataType := TDBXDataTypes.WideStringType; parametro.Name := 'pUsuario'; sql.Parameters.AddParameter(parametro); sql.Parameters.Parameter[0].Value.SetWideString(LoginModel.Usuario);
// parametro Senha parametro := sql.CreateParameter; parametro.DataType := TDBXDataTypes.WideStringType; parametro.Name := 'pSenha'; sql.Parameters.AddParameter(parametro); sql.Parameters.Parameter[1].Value.SetWideString(LoginModel.Senha);
sql.Prepare; // prepara a instruo SQL para executar no Banco reader := sql.ExecuteQuery; // executa o SQL e guarda o resultado no reader;
while (reader.Next) do // retorna True se o reader no estiver vazio Result := True;
except on E : Exception do ShowMessage('No foi possvel logar no sistema' + #13 + E.Message); end; finally // libera os objetos da memria FreeAndNil(dbcon); FreeAndNil(sql); FreeAndNil(reader); end;end;end.
Passaremos agora codificao do formulrio de nossa aplicao. Adicione o seguinte cdigo ao eventoOnClick do boto btnLogar:
Listagem 4: Evento OnClick do Boto btnLogar
procedure TfrmLogin.btnLogarClick(Sender: TObject);var
LoginModel: TLoginModel; LoginDAO: TLoginDAO;beginLoginModel := TLoginModel.Create; // cria o objeto LoginModel na MemriaLoginDAO := TLoginDAO.Create; // cria o objeto LoginDAO na Memria
// verifica se h algum edit em branco if (edtUsuario.Text = '') or (edtSenha.Text = '') then raise Exception.Create('Digite usurio e senha')
Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112
4 de 5 24/05/2013 13:56
-
else begin try LoginModel.Usuario := edtUsuario.Text; LoginModel.Senha := edtSenha.Text; if LoginDAO.Logar(LoginModel) then begin ShowMessage('Acesso Autorizado'); end else ShowMessage('Acesso no liberado'); finally // libera os objetos da memria FreeAndNil(LoginModel); FreeAndNil(LoginDAO); end; end;end;
No evento OnClick do boto btnSair, digite o seguinte o seguinte comando:
Listagem 5: Evento OnClick do Boto btnSair
procedure TfrmLogin.btnSairClick(Sender: TObject);begin Application.Terminate; // encerra a aplicao;end;
Concluso
A programao orientada a objetos e a aplicao do DAO Pattern melhoram em muito a qualidade denosso cdigo.
Este apenas um exemplo de como criar aplicaes orientadas a objetos no Delphi. Teste o cdigo,refatore e otimize este exemplo.
Um abrao.
por Thiago Augusto Gomes de Jesus
Possui 10 anos de experincia na rea de informtica. Apaixonado por programao, possuiconhecimentos em .NET C# e Delphi.
www.devmedia.com.br/articles/viewcomp.asp?comp=27112
Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112
5 de 5 24/05/2013 13:56