Você está na página 1de 5

Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?

comp=27112

www.devmedia.com.br

[verso para impresso]

POO e DAO Pattern no Delphi: Criando uma tela de login


Veja neste artigo como utilizar de maneira prtica assuntos como Programao Orientada a Objetos, DAO Pattern, e o framework DbExpress 4, assuntos muito importantes dentro da comunidade Delphi. Introduo
A POO (Programao Orientada a Objetos), cujos pilares bsicos so: Herana, Polimorfimo e Encapsulamento, uma metodologia inteligente de desenvolvimento de software, que visa tornar os sistemas 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 de responsabilidades (regras de negcio misturadas a camada de apresentao), onde o mesmo cdigo aparece repetidas vezes em diferentes pontos do sistema, tornando o custo de manuteno cada vez maior. No so raros os casos de empresas que precisaram reescrever sistemas do zero por tais problemas. 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 de negcio da camada de apresentao, centralizando as responsabilidades de manipulao do banco de dados e facilitando a manuteno. Neste tutorial criaremos um sistema simples de Login, utilizando conceitos de programao orientada a objetos 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 de programao 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 arquivos do Projeto. Utilizando o Banco de Dados e o Front End de sua preferncia, crie um novo banco e execute os scripts abaixo para criao da tabela Usuarios, e o usuario administrador, respectivamente: Listagem 1: Scripts do Banco de Dados
// Criao da tabela USUARIOS CREATE 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 tabela INSERT 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 transferir informaes 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

1 de 5

24/05/2013 13:56

Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112

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:

2 de 5

24/05/2013 13:56

Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112

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 uma conexo 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 solicitada novamente a cada nova conexo. Altere a propriedade Name do Data Module para dm_dados e a propriedade Name SQLConnection para LOGINOO. 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 de acesso e manipulao de dados mais utilizada pelos programadores Delphi. A nova arquitetura do DbExpress 4 traz novas features que permitem um desenvolvimento totalmente orientado 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

3 de 5

24/05/2013 13:56

Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112

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 evento OnClick do boto btnLogar: Listagem 4: Evento OnClick do Boto btnLogar
procedure TfrmLogin.btnLogarClick(Sender: TObject); var LoginModel: TLoginModel; LoginDAO: TLoginDAO; begin LoginModel := TLoginModel.Create; // cria o objeto LoginModel na Memria LoginDAO := 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')

4 de 5

24/05/2013 13:56

Verso para impresso: POO e DAO Pattern no Delphi: Criando uma tel... http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=27112

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 de nosso 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, possui conhecimentos em .NET C# e Delphi.

www.devmedia.com.br/articles/viewcomp.asp?comp=27112

5 de 5

24/05/2013 13:56

Você também pode gostar