versão para impressão_ poo e dao pattern no delphi_ criando uma tela de login

Upload: aureliano-duarte

Post on 30-Oct-2015

250 views

Category:

Documents


0 download

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