Olá pessoal, neste artigo mostrarei de forma prática e direta como é fácil 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 fácil de se entender e aplicar, vamos pôr 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 construída 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);7
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ó contém métodos com SQL, estes métodos são usados na nossa tela. Na Figura 1 segue uma sugestão de layout para a tela.
Observe abaixo o código do formulário, note que no create do mesmo instanciei 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.
Master Detail
Agora mostraremos uma relação simples “Master Detail” com POO no Delphi. Para isso vamos construir nossa tabela de Compras, vejam o código:
CREATE TABLE Compras( id int IDENTITY(1,1) NOT NULL,
Produto varchar(50),
Valor varchar(50), Data varchar(50), idCliente int )
Tendo em mente que você viu o artigo anterior, neste vou implementar apenas a classe de Compras (ou vendas, fique à vontade), FILE > NEW > UNIT. Observe o código da nossa unit uCompras:
unit uCompras;
interface uses ADODB, DB, SysUtils, uConn; type
TCompras = class private
FChave: integer;
FChaveCliente: integer;
FValor: string;
FProduto: string;
FData: string;
FQry: TADOQuery;
FQryPesquisa: TADOQuery;
FDs: TDataSource;
FDsPesquisa: tDataSource; Conexao : TConn;
procedure SetChave(const Value: integer);
procedure SetChaveCliente(const Value: integer);
procedure SetData(const Value: string);
procedure SetDs(const Value: TDataSource);
procedure SetDsPesquisa(const Value: tDataSource);
procedure SetProduto(const Value: string);
procedure SetQry(const Value: TADOQuery);
procedure SetQryPesquisa(const Value: TADOQuery);
procedure SetValor(const Value: string); public
constructor Create(Conn: TConn); // utiliza a classe de conexão
// Propriedades
property Chave : integer read FChave write SetChave;
property Produto : string read FProduto write SetProduto;
property Valor : string read FValor write SetValor;
// ou Real
property Data : string read FData write SetData;
// ou TDatetime
property ChaveCliente : integer read FChaveCliente write SetChaveCliente;
// 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,ChaveCliente: Integer; Produto,Ordem: String):Boolean;
function Inserir : boolean;
function Alterar : boolean;
function Deletar(chave: integer) : boolean;
end; implementation { TCompras }
function TCompras.Alterar: boolean; begin with Qry do
begin
Close;
SQL.Text := ' Update Compras Set '+
' Produto = :Produto,'+
' Valor = :Valor,'+
' Data = :Data,'+
' idCliente = :idCliente'+
' Where '+
' id = :id';
// Observe a utilização dos Fileds (FChave,Fnome...etc...)
Parameters.ParamByName('id').Value := FChave;
Parameters.ParamByName('Produto').Value := FProduto;
Parameters.ParamByName('Valor').Value := FValor;
Parameters.ParamByName('Data').Value := FData;
Parameters.ParamByName('idCliente').Value := ChaveCliente;
try
ExecSQL; Result := true; except
Result := False; end; end; end;
constructor TCompras.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 TCompras.Deletar(chave: integer): boolean;
begin
with Qry do begin Close;
SQL.Text := ' delete from Compras'+
' where id = :Chave';
Parameters.ParamByName('Chave').Value := Chave;
try
ExecSQL; Result := True; except
Result := False; end; end; end;
function TCompras.Inserir: boolean; begin with Qry do
begin Close;
Sql.text := ' Insert into Compras'+
' (Produto, Valor, Data, idCliente)'+
' Values '+
' (:Produto, :Valor, :Data, :idCliente)';
// Observe a utilização dos Fileds (FChave,Fnome...etc...)
Parameters.ParamByName('Produto').Value := FProduto;
Parameters.ParamByName('Valor').Value := FValor;
Parameters.ParamByName('Data').Value := FData;
Parameters.ParamByName('idCliente').Value := ChaveCliente;
try
ExecSQL; result := true;
except
result := false;
end;
end; end;
function TCompras.Selecionar(Chave,ChaveCliente: Integer; Produto, Ordem: String): Boolean; begin
{Observe que posso buscar por id da compra ou id do cliente} Produto := '%'+Produto+'%';
with QryPesquisa do begin Close;
Sql.Text := ' Select * from Compras where 1=1 ';
if Chave > 0 then begin
Sql.add(' and id = :Chave');
Parameters.ParamByName('Chave').Value := Chave;
end;
if ChaveCliente > 0 then begin
Sql.add(' and idCliente = :ChaveCliente');
Parameters.ParamByName('ChaveCliente').Value := ChaveCliente;
end;
if Produto <> '' then
sql.add(' and Produto like '+quotedstr(Produto));
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 do begin with Qrypesquisa do end;
procedure TCompras.SetChave(const Value: integer); begin
FChave := Value; end;
procedure TCompras.SetChaveCliente(const Value: integer); begin
FChaveCliente := Value; end;
procedure TCompras.SetData(const Value: string);
begin
FData := Value; end;
procedure TCompras.SetDs(const Value: TDataSource);
begin
FDs := Value; end;
procedure TCompras.SetDsPesquisa(const Value: tDataSource); begin
FDsPesquisa := Value; end;
procedure TCompras.SetProduto(const Value: string); begin
FProduto := Value; end;
procedure TCompras.SetQry(const Value: TADOQuery); begin
FQry := Value; end;
procedure TCompras.SetQryPesquisa(const Value: TADOQuery); begin
FQryPesquisa := Value; end;
procedure TCompras.SetValor(const Value: string); begin
FValor := Value; end;
end.
Notem que é tudo muito igual ao primeiro artigo, os métodos de SQL têm o mesmo nome, são as operações básicas do dia a dia, com esta classe criada vamos agora para criação da nossa tela, o frmPrincipal, onde teremos dois dbgrids um para exibir o cliente e outro para exibir as compras feitas pelo mesmo, observe abaixo o código da unit ufrmPrincipal:
unit ufrmPrincipal; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls, uConn, uClientes,
uCompras, Menus, ufrmInsereCompra;
type
TfrmPrincipal = class(TForm)
DBGridMaster: TDBGrid;
DBGridDetail: TDBGrid;
Label1: TLabel;
Label2: TLabel;
DBNavMaster: TDBNavigator;
DBNavDetail: TDBNavigator;
Label3: TLabel; Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure DBGridMasterCellClick(Column: TColumn);
procedure DBGridMasterDblClick(Sender: TObject);
procedure DBGridDetailDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmPrincipal: TfrmPrincipal;
Conn : TConn;
Cliente : TClientes; Compra : TCompras; implementation {$R *.dfm}
procedure TfrmPrincipal.FormCreate(Sender: TObject); begin
Conn := TConn.Create; // cria o obj de conexão e conecta
Cliente := TClientes.Create(Conn);
// cria o obj cliente e vicula o mesmo a conexão
Compra := TCompras.Create(Conn); // cria o obj compra...
Cliente.Selecionar(0,'','Nome');
DBGridMaster.DataSource := Cliente.DsPesquisa;
DBNavMaster.DataSource := Cliente.DsPesquisa;
DBGridDetail.DataSource := Compra.DsPesquisa; DBNavDetail.DataSource := Compra.DsPesquisa; end;
procedure TfrmPrincipal.DBGridDetailDblClick(Sender: TObject); begin // deleta registro
if Compra.Deletar(DBGridDetail.DataSource.DataSet.FieldByName('id').AsInteger) then begin
Application.MessageBox('Registro deletado com sucesso!','Confirmação',MB_OK); end else begin
Application.MessageBox('O registro não foi deletado!','Atenção',MB_OK); end;
// refresh no grid
Compra.Selecionar(0,DBGridMaster.DataSource.DataSet.fieldbyname('id').AsInteger,'','Produto
');
end;
procedure TfrmPrincipal.DBGridMasterCellClick(Column: TColumn); begin
{Com um clique realiza um select na tabela de compras}
Compra.Selecionar(0,DBGridMaster.DataSource.DataSet.fieldbyname('id').AsInteger,'','Produto
');
end;
procedure TfrmPrincipal.DBGridMasterDblClick(Sender: TObject); var
frmVende : TfrmInsereCompra; begin
// chama form de venda
try
frmVende := TfrmInsereCompra.Create(nil); frmVende.ShowModal;
finally
FreeandNil(frmVende); end; // end try end; end.
Observem que não estamos usando ainda a separação das camadas que é altamente recomendável, mas como este é um exemplo para introdução a POO no Delphi usamos aqui apenas a persistência e a tela, facilitando assim o aprendizado.
Seguindo então vamos criar um form para “realizar as vendas conforme o código da unit ufrmInsereCompra:
unit ufrmInsereCompra;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ImgList, Buttons, ExtCtrls;
type
TfrmInsereCompra = class(TForm) Label1: TLabel;
lblClienteSelecionado: TLabel; BitBtn1: TBitBtn;
RgProdutos: TRadioGroup;
procedure FormCreate(Sender: TObject); procedure BitBtn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction); private
{ Private declarations } public
{ Public declarations } end;
var
frmInsereCompra: TfrmInsereCompra;
implementation uses ufrmPrincipal, uCompras;
// para ter acesso aos objetos criados la.
{$R *.dfm}
procedure TfrmInsereCompra.BitBtn1Click(Sender: TObject); begin
with Compra do // para valores as properties begin
Case RgProdutos.ItemIndex of // para exemplificar o case
0 : begin
Produto := 'Corsa 1.0'; valor := 'R$ 30,00'; end; 1 : begin
Produto := 'Sabão em pó'; valor := 'R$ 150,00';
end; 2 : begin
Produto := 'Galinha Caipira'; valor := 'R$ 80,00'; end; 3 : begin
Produto := 'Revista Playboy'; valor := 'R$ 50,00'; end; end; // end case
Data := Formatdatetime('dd/mm/yyyy', date);
ChaveCliente := Cliente.DsPesquisa.DataSet.fieldbyname('id').asinteger;
if Inserir then // operação incluir
begin
Application.MessageBox('O registro incluído com sucesso !','Confirmação',MB_OK);
end else begin
Application.MessageBox('O registro não foi incluído!','Atenção',MB_OK); end;
end; end;
procedure TfrmInsereCompra.FormClose(Sender: TObject; var Action: TCloseAction); begin
// antes de fechar dar um refresh no grid
Compra.Selecionar(0,frmPrincipal.DBGridMaster.DataSource.DataSet.fieldbyname('id')
.AsInteg er,'','Produto'); end;
procedure TfrmInsereCompra.FormCreate(Sender: TObject);
begin
// Observem, o cliente aqui é o mesmo usado no formPrincipal...
lblClienteSelecionado.Caption := Cliente.DsPesquisa.DataSet.fieldbyname('Fantasia').asstring; end; end.