Você está na página 1de 10

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;
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 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
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;
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 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;


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 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
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
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;
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 // operação incluir


begin
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);


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 // 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);


begin
if 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);
end
else
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 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 conexão e conecta
Clientes := 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;
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 aplicação em funcionamento, qualquer sugestão ou dúvida entrem


em contato : leoquartieri@hotmail.com

por:
Leonardo Quartieri
Desenvolvedor Delphi & Delphi.Net
30/04/2007- Brasília - DF

Você também pode gostar