POO - Delphi - Leonardo Quartieri
Click here to load reader
-
Upload
flaviano-costa-silva -
Category
Documents
-
view
18 -
download
8
description
Transcript of 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
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;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'+
' 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
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);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
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;
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);
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