Vous êtes sur la page 1sur 10

Ol pessoal, neste artigo mostrarei de forma prtica e direta como facil

utilizar POO no Delphi, criaremos uma classe para conexo e uma classe de
clientes para realizar as operaes de Select, Insert, Update e Delete no
banco. A POO (Programao Orientada a Objetos) facilita e muito a
manuteno e o reaproveitamento de cdigo, sendo ainda facil de se entender
e aplicar, vamos por a mo 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 construo de nossa classe de conexo,


(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;
begin
Conn := 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 mtodo disponvel, e no
mesmo a conexo j realizada, claro, voc pode e deve implementar outros
mtodos nesta classe como capturar a string de conexo de um arquivo ini ou
xml, mas como a inteno aqui e mostrar os primeiros passos POO no Delphi

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 conexo
// 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;
// Mtodos
function Selecionar(Chave: Integer; Nome,Ordem: String):Boolean;

function Inserir : boolean;


function Alterar : boolean;
function Deletar(chave: integer) : boolean;
end;
implementation
{ TClientes }
function TClientes.Alterar: boolean;
begin
with Qry do
begin
Close;
SQL.Text := ' Update Clientes Set '+
' Nome = :Nome,'+
' Endereco = :Endereco,'+
' Telefones = :Telefones,'+
' Obs = :Obs'+
' Where '+
' id = :id';
// Observe a utilizao 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;
begin
with Qry do
begin
Close;
SQL.Text := ' delete from Clientes'+

' where id = :Chave';


Parameters.ParamByName('Chave').Value := Chave;
try
ExecSQL;
Result := True;
except
Result := False;
end;
end;
end;
function TClientes.Inserir: boolean;
begin
with Qry do
begin
Close;
Sql.text := ' Insert into Clientes'+
' (Nome, Endereco, Telefones, Obs)'+
' Values '+
' (:Nome, :Endereco, :Telefones, :Obs)';
// Observe a utilizao 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

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

mtodos so usados na nossa tela, abaixo segue uma sugesto de layout para
a tela:

Observe abaixo o cdigo do formulrio, note que no create do mesmo


instnciei nossas classes e j realizei um select para carregar o grid.
Cdigo 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;

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);
begin
if 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 // operao incluir
begin

Application.MessageBox('Registro incluido com sucesso!','Confirmao',MB_OK);


end
else
begin
Application.MessageBox('O registro no foi includo!','Ateno',MB_OK);
end;
end;
LimpaCampos;
end;
procedure TfrmPrincipal.BitBtn2Click(Sender: TObject);
begin
if 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 // operao alterar
begin
Application.MessageBox('Registro alterado com sucesso!','Confirmao',MB_OK);
end
else
begin
Application.MessageBox('O registro no foi alterado!','Ateno',MB_OK);
end;
end;
LimpaCampos;
end;
procedure TfrmPrincipal.BitBtn3Click(Sender: TObject);
begin
if edtClienteDel.text = '' then exit;
if clientes.Deletar(DBGrid1.DataSource.DataSet.FieldByName('id').asinteger)then
begin
Application.MessageBox('Registro deletado com sucesso!','Ateno',MB_OK);
end
else
begin
Application.MessageBox('O registro no foi deletado!','Ateno',MB_OK);
end;
LimpaCampos;
end;
procedure TfrmPrincipal.DBGrid1CellClick(Column: TColumn);
begin
// carrega dados na tela de update e delete
edtUpNome.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;

edtClienteDel.text := DBGrid1.DataSource.DataSet.FieldByName('Nome').asstring;
end;
procedure TfrmPrincipal.DBGrid1DblClick(Sender: TObject);
begin
// duplo click no grid leva para tela de update
PageControl1.ActivePageIndex := 2;
end;
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
Conn
:= TConn.Create; // Cria a conexo e conecta
Clientes
:= TClientes.Create(Conn); // cria o objeto cliente
Clientes.Selecionar(0,'','Nome'); // metodo de seleo de cliente
DBGrid1.DataSource
:= clientes.DsPesquisa;
DBNavigator1.DataSource:= Clientes.DsPesquisa;
//Conn.Destroy;
end;
procedure TfrmPrincipal.LimpaCampos;
var
i : integer; // limpa edits e memos
begin
for 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);
begin
if PageControl1.ActivePageIndex = 0 then
Clientes.Selecionar(0,'','Nome'); // refresh no grid
end;
procedure TfrmPrincipal.Label15MouseLeave(Sender: TObject);
begin
label15.Font.Style := []; // efeito link
end;
procedure TfrmPrincipal.Label15MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
label15.Font.Style := [fsUnderline]; // efeito link
end;
procedure TfrmPrincipal.Label15Click(Sender: TObject);
var
frmSplashSobre : TfrmSplashSobre;
begin
try
frmSplashSobre := TfrmSplashSobre.create(application);

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

****************************
Observem a aplicao em funcionamento, qualquer sugesto ou dvida entrem
em contato : leoquartieri@hotmail.com

por:
Leonardo Quartieri
Desenvolvedor Delphi & Delphi.Net
30/04/2007- Braslia - DF