POO - Delphi - Leonardo Quartieri

10

Click here to load reader

description

poo

Transcript of POO - Delphi - Leonardo Quartieri

Page 1: POO - Delphi - Leonardo Quartieri

Olá pessoal, neste artigo mostrarei de forma prática e direta como é facil utilizar POO no Delphi, criaremos uma classe para conexão e uma classe de clientes para realizar as operações de Select, Insert, Update e Delete no banco. A POO (Programação Orientada a Objetos) facilita e muito a manutenção e o reaproveitamento de código, sendo ainda facil de se entender e aplicar, vamos por a mão na massa?

Crie um banco de dados com uma tabela chamada Clientes:// Observe que o campo id é auto incremento

CREATE TABLE Clientes(id int IDENTITY(1,1) NOT NULL,Nome varchar(50),Endereco varchar(50),Telefones varchar(50),Obs varchar(200)

)

Tabela construida vamos agora para a construção de nossa classe de conexão, (File > New > Unit) nesta eu utilizei ADO, observe abaixo a unit uConn :

****************************unit uConn;

interface

uses ADODB;

type TConn = class public Conn : TADOConnection; constructor Create; end;implementation{ TConn }constructor TConn.Create;beginConn := TADOConnection.Create(nil);Conn.LoginPrompt := false;Conn.ConnectionString := 'Provider=SQLOLEDB.1'+ ';Password=XXXXX'+ ';Persist Security Info=False'+ ';User ID=XXXXX'+ ';Initial Catalog=Clientes'+ ';Data Source=QD_08';Conn.Connected := true;end;end.

****************************

Observe que na classe TConn o create é o único método disponível, e no mesmo a conexão já é realizada, claro, você pode e deve implementar outros métodos nesta classe como capturar a string de conexão de um arquivo ini ou xml, mas como a intenção aqui e mostrar os primeiros passos POO no Delphi

Page 2: POO - Delphi - Leonardo Quartieri

fiz de forma reduzida.

Agora vamos a classe de Clientes(File > New > Unit), observe abaixo a unit uClientes :

****************************unit uClientes;

interface

uses ADODB, DB, SysUtils, uConn;

type

TClientes = class private FObs: string; FNome: string; FChave: integer; FEndereco: string; FTelefone: string; FQry: TADOQuery; FDs: TDataSource; Conexao : TConn; FDsPesquisa: tDataSource; FQryPesquisa: TADOQuery; procedure SetChave(const Value: integer); procedure SetEndereco(const Value: string); procedure SetNome(const Value: string); procedure SetObs(const Value: string); procedure SetTelefone(const Value: string); procedure SetDs(const Value: TDataSource); procedure SetQry(const Value: TADOQuery); procedure SetDsPesquisa(const Value: tDataSource); procedure SetQryPesquisa(const Value: TADOQuery); published

public

constructor Create(Conn: TConn); // utiliza a classe de conexão // Propriedades property Chave : integer read FChave write SetChave; property Nome : string read FNome write SetNome; property Endereco : string read FEndereco write SetEndereco; property Telefone : string read FTelefone write SetTelefone; property Obs : string read FObs write SetObs;

// Componentes property Qry : TADOQuery read FQry write SetQry; property QryPesquisa : TADOQuery read FQryPesquisa write SetQryPesquisa;

property Ds : TDataSource read FDs write SetDs; property DsPesquisa : tDataSource read FDsPesquisa write SetDsPesquisa;

// Métodos function Selecionar(Chave: Integer; Nome,Ordem: String):Boolean;

Page 3: POO - Delphi - Leonardo Quartieri

function Inserir : boolean; function Alterar : boolean; function Deletar(chave: integer) : boolean;

end;

implementation

{ TClientes }

function TClientes.Alterar: boolean;beginwith Qry do begin Close; SQL.Text := ' Update Clientes Set '+ ' Nome = :Nome,'+ ' Endereco = :Endereco,'+ ' Telefones = :Telefones,'+ ' Obs = :Obs'+ ' Where '+ ' id = :id'; // Observe a utilização dos Fileds (FChave,Fnome...etc...) Parameters.ParamByName('id').Value := FChave; Parameters.ParamByName('Nome').Value := Fnome; Parameters.ParamByName('Endereco').Value := Fendereco; Parameters.ParamByName('Telefones').Value := FTelefone; Parameters.ParamByName('Obs').Value := FObs; try ExecSQL; Result := true; except Result := False; end; end;end;

constructor TClientes.Create(Conn: TConn);begin{ No create é passada a conection das Qrys }Conexao := Conn;Qry := TADOQuery.Create(nil);Ds := TDataSource.Create(nil);QryPesquisa := TADOQuery.Create(nil);DsPesquisa := TDataSource.Create(nil);

Qry.Connection := Conexao.Conn;QryPesquisa.Connection := Conexao.Conn;

Ds.DataSet := Qry;DsPesquisa.DataSet := QryPesquisa;end;

function TClientes.Deletar(Chave: integer): boolean;beginwith Qry do begin Close; SQL.Text := ' delete from Clientes'+

Page 4: POO - Delphi - Leonardo Quartieri

' where id = :Chave'; Parameters.ParamByName('Chave').Value := Chave; try ExecSQL; Result := True; except Result := False; end; end;end;

function TClientes.Inserir: boolean;beginwith Qry do begin Close; Sql.text := ' Insert into Clientes'+ ' (Nome, Endereco, Telefones, Obs)'+ ' Values '+ ' (:Nome, :Endereco, :Telefones, :Obs)'; // Observe a utilização dos Fileds (FChave,Fnome...etc...) Parameters.ParamByName('Nome').Value := Fnome; Parameters.ParamByName('Endereco').Value := Fendereco; Parameters.ParamByName('Telefones').Value := FTelefone; Parameters.ParamByName('Obs').Value := FObs;

try ExecSQL; result := true; except result := false; end; end;end;

function TClientes.Selecionar(Chave: Integer; Nome,Ordem: String): Boolean;begin

Nome := '%'+Nome+'%';

with QryPesquisa do begin Close; Sql.Text := ' Select * from Clientes where 1=1 ';

if Chave > 0 then begin Sql.add(' and id = :Chave'); Parameters.ParamByName('Chave').Value := Chave; end;

if Nome <> '' then sql.add(' and Nome like '+quotedstr(Nome));

if Ordem <> '' then sql.add(' Order by '+Ordem); try Open; if not eof then

Page 5: POO - Delphi - Leonardo Quartieri

Result := true else Result := false; except Result := false; end; end;end;

procedure TClientes.SetChave(const Value: integer);begin FChave := Value;end;

procedure TClientes.SetDs(const Value: TDataSource);begin FDs := Value;end;

procedure TClientes.SetDsPesquisa(const Value: tDataSource);begin FDsPesquisa := Value;end;

procedure TClientes.SetEndereco(const Value: string);begin FEndereco := Value;end;

procedure TClientes.SetNome(const Value: string);begin FNome := Value;end;

procedure TClientes.SetObs(const Value: string);begin FObs := Value;end;

procedure TClientes.SetQry(const Value: TADOQuery);begin FQry := Value;end;

procedure TClientes.SetQryPesquisa(const Value: TADOQuery);begin FQryPesquisa := Value;end;

procedure TClientes.SetTelefone(const Value: string);begin FTelefone := Value;end;

end.

****************************

Observem que esta classe é simples e só contem metodos com SQL, estes

Page 6: POO - Delphi - Leonardo Quartieri

métodos são usados na nossa tela, abaixo segue uma sugestão de layout para a tela:

Observe abaixo o código do formulário, note que no create do mesmo instânciei nossas classes e já realizei um select para carregar o grid.Código da unit ufrmPrincipal :

****************************unit ufrmPrincipal;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uConn, StdCtrls, Buttons, Grids, DBGrids, ExtCtrls, DBCtrls, ComCtrls, uClientes;

type TfrmPrincipal = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; TabSheet3: TTabSheet; TabSheet4: TTabSheet; Label1: TLabel; DBNavigator1: TDBNavigator; DBGrid1: TDBGrid; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; edtNome: TEdit; edtEndereco: TEdit; edtTelefone: TEdit; mmoObs: TMemo; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel;

Page 7: POO - Delphi - Leonardo Quartieri

BitBtn1: TBitBtn; BitBtn2: TBitBtn; mmoUPObs: TMemo; edtUpTelefones: TEdit; Label10: TLabel; Label11: TLabel; edtUpEndereco: TEdit; Label12: TLabel; Label13: TLabel; edtUpNome: TEdit; Label14: TLabel; edtClienteDel: TEdit; BitBtn3: TBitBtn; Label15: TLabel; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure DBGrid1CellClick(Column: TColumn); procedure BitBtn2Click(Sender: TObject); procedure DBGrid1DblClick(Sender: TObject); procedure PageControl1Change(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure Label15MouseLeave(Sender: TObject); procedure Label15MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Label15Click(Sender: TObject); private { Private declarations }

procedure LimpaCampos; public { Public declarations }

end;

var frmPrincipal: TfrmPrincipal; Conn : TConn; Clientes : TClientes;

implementation

uses DB, ufrmSplashSobre;

{$R *.dfm}

procedure TfrmPrincipal.BitBtn1Click(Sender: TObject);beginif edtNome.text = '' then exit;

with Clientes do // preeencho as properties begin Nome := edtNome.text; Endereco := edtEndereco.text; Telefone := edtTelefone.text; Obs := mmoObs.Text;

if Inserir then // operação incluir begin

Page 8: POO - Delphi - Leonardo Quartieri

Application.MessageBox('Registro incluido com sucesso!','Confirmação',MB_OK); end else begin Application.MessageBox('O registro não foi incluído!','Atenção',MB_OK); end; end;

LimpaCampos;end;

procedure TfrmPrincipal.BitBtn2Click(Sender: TObject);beginif edtUpNome.text = '' then exit;

with Clientes do // preeencho as properties begin Chave := DBGrid1.DataSource.DataSet.FieldByName('id').AsInteger; Nome := edtUpNome.text; Endereco := edtUpEndereco.text; Telefone := edtUpTelefones.text; Obs := mmoUpObs.Text;

if Alterar then // operação alterar begin Application.MessageBox('Registro alterado com sucesso!','Confirmação',MB_OK); end else begin Application.MessageBox('O registro não foi alterado!','Atenção',MB_OK); end; end;LimpaCampos; end;

procedure TfrmPrincipal.BitBtn3Click(Sender: TObject);beginif edtClienteDel.text = '' then exit;

if clientes.Deletar(DBGrid1.DataSource.DataSet.FieldByName('id').asinteger)then begin Application.MessageBox('Registro deletado com sucesso!','Atenção',MB_OK); endelse begin Application.MessageBox('O registro não foi deletado!','Atenção',MB_OK); end;LimpaCampos;end;

procedure TfrmPrincipal.DBGrid1CellClick(Column: TColumn);begin// carrega dados na tela de update e deleteedtUpNome.text := DBGrid1.DataSource.DataSet.FieldByName('Nome').asstring;edtUpEndereco.text := DBGrid1.DataSource.DataSet.FieldByName('Endereco').asstring;edtUpTelefones.text := DBGrid1.DataSource.DataSet.FieldByName('telefones').asstring;mmoUPObs.Text := DBGrid1.DataSource.DataSet.FieldByName('Obs').asstring;

Page 9: POO - Delphi - Leonardo Quartieri

edtClienteDel.text := DBGrid1.DataSource.DataSet.FieldByName('Nome').asstring;end;

procedure TfrmPrincipal.DBGrid1DblClick(Sender: TObject);begin// duplo click no grid leva para tela de updatePageControl1.ActivePageIndex := 2;end;

procedure TfrmPrincipal.FormCreate(Sender: TObject);beginConn := TConn.Create; // Cria a conexão e conectaClientes := TClientes.Create(Conn); // cria o objeto cliente

Clientes.Selecionar(0,'','Nome'); // metodo de seleção de cliente

DBGrid1.DataSource := clientes.DsPesquisa;DBNavigator1.DataSource:= Clientes.DsPesquisa;

//Conn.Destroy;end;

procedure TfrmPrincipal.LimpaCampos;vari : integer; // limpa edits e memosbeginfor I := 1 to ComponentCount -1 do begin if Components[i] is Tedit then (Components[i] as TEdit).clear; if Components[i] is TMemo then (Components[i] as TMemo).clear; end;end;

procedure TfrmPrincipal.PageControl1Change(Sender: TObject);beginif PageControl1.ActivePageIndex = 0 then Clientes.Selecionar(0,'','Nome'); // refresh no gridend;

procedure TfrmPrincipal.Label15MouseLeave(Sender: TObject);beginlabel15.Font.Style := []; // efeito linkend;

procedure TfrmPrincipal.Label15MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);beginlabel15.Font.Style := [fsUnderline]; // efeito linkend;

procedure TfrmPrincipal.Label15Click(Sender: TObject);varfrmSplashSobre : TfrmSplashSobre;begintry frmSplashSobre := TfrmSplashSobre.create(application);

Page 10: POO - Delphi - Leonardo Quartieri

frmSplashSobre.ShowModal; finally freeandnil(frmSplashSobre); end;end;

end.

****************************

Observem a aplicação em funcionamento, qualquer sugestão ou dúvida entrem em contato : [email protected]

por:Leonardo Quartieri

Desenvolvedor Delphi & Delphi.Net30/04/2007- Brasília - DF