RE: [delphi-br] POO em 3 camadas

2010-07-20 Por tôpico Bruno Lichot
Creio que o primeiro passo e observar um pouco do uso de OO nos seguintes links:

 

http://cc.codegear.com/Item/25344 http://cc.codegear.com/Item/25344  

http://cc.embarcadero.com/item/27353 http://cc.embarcadero.com/item/27353 

http://cc.embarcadero.com/item/27352 http://cc.embarcadero.com/item/27352 

http://cc.embarcadero.com/item/27295 http://cc.embarcadero.com/item/27295 

http://cc.embarcadero.com/item/27266 http://cc.embarcadero.com/item/27266 

http://cc.embarcadero.com/item/27247 http://cc.embarcadero.com/item/27247 

http://cc.embarcadero.com/item/26347 http://cc.embarcadero.com/item/26347 

http://cc.embarcadero.com/item/26349 http://cc.embarcadero.com/item/26349 

http://cc.embarcadero.com/item/26378 http://cc.embarcadero.com/item/26378 

http://cc.embarcadero.com/item/26405 http://cc.embarcadero.com/item/26405 

http://cc.embarcadero.com/item/26429 http://cc.embarcadero.com/item/26429 

http://cc.embarcadero.com/item/26425 http://cc.embarcadero.com/item/26425 

http://cc.embarcadero.com/item/26411 http://cc.embarcadero.com/item/26411 

Depois pega um entendimento do framework multicamadas do Delphi, o DataSnap. 
Voce pode acompanhar uma séria de artigos específicos na ActiveDelphi desde a 
edição 74 ou nos links abaixo:

 

HTTP://www.yahoogrupos.com.br/group/nddv

HTTP://cc.embarcadero.com/author/795118 (veja o exemplo do artigo, a apostila 
de criação de componentes e o vídeo do FDD 2008)

Central de Recursos: 
http://www.embarcadero.com/products/rad-studio/resource-center

DataSnap: http://www.embarcadero-info.com/in_action/radstudio/db.html 
http://www.embarcadero-info.com/in_action/radstudio/db.html  

REST: http://www.embarcadero-info.com/in_action/radstudio/rest.html 
http://www.embarcadero-info.com/in_action/radstudio/rest.html  

DataSnap:  http://blogs.embarcadero.com/davidi/2009/11/06/39866 

 

Creio que com isso poderá montar seu modelo OO, em qualquer arquitetura, 
inclusive em multicamadas. J

 

 

From: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] On 
Behalf Of Pedro de Souza
Sent: segunda-feira, 19 de julho de 2010 23:33
To: DelphiBr
Subject: [delphi-br] POO em 3 camadas

 

  

Boa noite pessoal, programei por vários anos em VB6 e depois de um tempo sem 
programar estou voltando a ativa com o D2010.
Aprendi rápido o básico como a sintaxe e os componentes, mais estou tendo 
problemas com POO em 3 camadas. Estou fazendo um cadastro simples onde tenho o 
seguinte cenário:

1 DataModule : TSQLConnection, TSQLTable, TSQLStoredProc
1 Form: DataSetprovider, ClientDataSet, DataSource, DBNavigator, os campos das 
tabelas DBEdit, TDBComboBox e os botões de ação incluir, excluir, etc...
1 Unit: que é a minha classe.

Consigo navegar pelos regiostros mais quando tento fazer o cadastro recebo a 
seguinte mensagem: Access violation at address 0060680C in module 
'Cadastro.exe' Write of address 0004.
Pesquisando percebi que a referência da minha classe está como nil quanto chamo 
o método incluir, mais como carregar a classe corretamente? Me corrijam se eu 
estiver errado.
Segue abaixo o código que estou usando:
A parte em negrito no form é onde acontece o erro. Coloquei um if para tratar o 
erro mais como corrigir?
Desde já agradeço a ajuda de vocês.

DATAMODULE:
unit DMAnoLetivo;

interface

uses
SysUtils, Classes, DSConnect, DBClient, SConnect, DB, MConnect, WideStrings,
DBXOracle, SqlExpr, FMTBcd, CLCadAnoLetivo, Dialogs;

type
TDTMAnoLetivo = class(TDataModule)
ConnR110ANO: TSQLConnection;
TableR110ANO: TSQLTable;
SpR110ANO: TSQLStoredProc;
TableR110ANOCODANO: TFMTBCDField;
TableR110ANOANOLET: TFMTBCDField;
TableR110ANOINIANO: TSQLTimeStampField;
TableR110ANOFINANO: TSQLTimeStampField;
TableR110ANOSITANO: TWideStringField;
private
{ Private declarations }
public
{ Public declarations }
function Incluir(FCodAno :TAnoLetivo):Boolean;
end;

var
dtmAnoLetivo: TDTMAnoLetivo;

implementation

{$R *.dfm}

{TDTMAnoLetivo}

function TDTMAnoLetivo.Incluir(FCodAno :TAnoLetivo):Boolean;
begin
result := false;
try
if not ConnR110ANO.Connected then
ConnR110ANO.Open;

if spR110ANO.Active then
spR110ANO.Close;

spR110ANO.ClearFields;

spR110ANO.StoredProcName := 'spCadAnoLetivo';

spR110ANO.Params.ParamByName('p_CodAno').Value := FCodAno.CodAno;
spR110ANO.Params.ParamByName('p_AnoLet').Value := FCodAno.AnoLet;
spR110ANO.Params.ParamByName('p_IniAno').Value := FCodAno.IniAno;
spR110ANO.Params.ParamByName('p_FinAno').Value := FCodAno.FinAno;
spR110ANO.Params.ParamByName('p_SitAno').Value := FCodAno.SitAno;

spR110ANO.ExecProc;
result := true;
except
on e:exception do
ShowMessage('Houve um problema de comunicação com o banco de dados!');
end;
end;

end.

FORM:
unit frmCadAnoLetivoUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, RzBckgnd, RzBorder, ExtCtrls, DBCtrls, Buttons,
Mask, DB, DBClient, Provider;

type
TfrmCadAnoLetivo = class(TForm)
Label2: TLabel;
Label1: TLabel;
RzBorder: TRzBorder;

Re: [delphi-br] POO em 3 camadas

2010-07-20 Por tôpico Marcos Bernardo
link que eskeci..
http://pastebin.com/qPHABL1E
http://pastebin.com/qPHABL1Eabraço
Marcos

Em 20 de julho de 2010 13:56, Marcos Bernardo xmarcos@gmail.comescreveu:

 Olá a Todos...
 As vezes tentamos entender os codigos postados e fica meio confuso dever o
 codigo no email

 Como sugestão... peço aos amigos colaboradores... postar os codigo em
 http://pastebin.com

 assim facilia bastante..
 como exemplo sego o codigo de nosso amigo...

 So uma Sugestão hein..heheh =D

 abraço
 Marcos Bernardo


 Em 19 de julho de 2010 23:32, Pedro de Souza pedros...@yahoo.com.brescreveu:



 Boa noite pessoal, programei por vários anos em VB6 e depois de um tempo
 sem programar estou voltando a ativa com o D2010.
 Aprendi rápido o básico como a sintaxe e os componentes, mais estou tendo
 problemas com POO em 3 camadas. Estou fazendo um cadastro simples onde tenho
 o seguinte cenário:

 1 DataModule : TSQLConnection, TSQLTable, TSQLStoredProc
 1 Form: DataSetprovider, ClientDataSet, DataSource, DBNavigator, os campos
 das tabelas DBEdit, TDBComboBox e os botões de ação incluir, excluir, etc...
 1 Unit: que é a minha classe.

 Consigo navegar pelos regiostros mais quando tento fazer o cadastro recebo
 a seguinte mensagem: Access violation at address 0060680C in module
 'Cadastro.exe' Write of address 0004.
 Pesquisando percebi que a referência da minha classe está como nil quanto
 chamo o método incluir, mais como carregar a classe corretamente? Me
 corrijam se eu estiver errado.
 Segue abaixo o código que estou usando:
 A parte em negrito no form é onde acontece o erro. Coloquei um if para
 tratar o erro mais como corrigir?
 Desde já agradeço a ajuda de vocês.

 DATAMODULE:
 unit DMAnoLetivo;

 interface

 uses
 SysUtils, Classes, DSConnect, DBClient, SConnect, DB, MConnect,
 WideStrings,
 DBXOracle, SqlExpr, FMTBcd, CLCadAnoLetivo, Dialogs;

 type
 TDTMAnoLetivo = class(TDataModule)
 ConnR110ANO: TSQLConnection;
 TableR110ANO: TSQLTable;
 SpR110ANO: TSQLStoredProc;
 TableR110ANOCODANO: TFMTBCDField;
 TableR110ANOANOLET: TFMTBCDField;
 TableR110ANOINIANO: TSQLTimeStampField;
 TableR110ANOFINANO: TSQLTimeStampField;
 TableR110ANOSITANO: TWideStringField;
 private
 { Private declarations }
 public
 { Public declarations }
 function Incluir(FCodAno :TAnoLetivo):Boolean;
 end;

 var
 dtmAnoLetivo: TDTMAnoLetivo;

 implementation

 {$R *.dfm}

 {TDTMAnoLetivo}

 function TDTMAnoLetivo.Incluir(FCodAno :TAnoLetivo):Boolean;
 begin
 result := false;
 try
 if not ConnR110ANO.Connected then
 ConnR110ANO.Open;

 if spR110ANO.Active then
 spR110ANO.Close;

 spR110ANO.ClearFields;

 spR110ANO.StoredProcName := 'spCadAnoLetivo';

 spR110ANO.Params.ParamByName('p_CodAno').Value := FCodAno.CodAno;
 spR110ANO.Params.ParamByName('p_AnoLet').Value := FCodAno.AnoLet;
 spR110ANO.Params.ParamByName('p_IniAno').Value := FCodAno.IniAno;
 spR110ANO.Params.ParamByName('p_FinAno').Value := FCodAno.FinAno;
 spR110ANO.Params.ParamByName('p_SitAno').Value := FCodAno.SitAno;

 spR110ANO.ExecProc;
 result := true;
 except
 on e:exception do
 ShowMessage('Houve um problema de comunicação com o banco de dados!');
 end;
 end;

 end.

 FORM:
 unit frmCadAnoLetivoUnit;

 interface

 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, RzBckgnd, RzBorder, ExtCtrls, DBCtrls,
 Buttons,
 Mask, DB, DBClient, Provider;

 type
 TfrmCadAnoLetivo = class(TForm)
 Label2: TLabel;
 Label1: TLabel;
 RzBorder: TRzBorder;
 RzSeparator: TRzSeparator;
 StatusBar: TStatusBar;
 Label3: TLabel;
 Label4: TLabel;
 DBNavigator: TDBNavigator;
 btAlterar: TBitBtn;
 btCancelar: TBitBtn;
 btExcluir: TBitBtn;
 btAjuda: TBitBtn;
 btFechar: TBitBtn;
 btPesquisar: TBitBtn;
 btIncluir: TBitBtn;
 Label5: TLabel;
 cboSituacao: TDBComboBox;
 txtDataFim: TDBEdit;
 txtDataInicio: TDBEdit;
 txtAnoLetivo: TDBEdit;
 cboCodAnoLetivo: TDBComboBox;
 DataSetProvider: TDataSetProvider;
 ClientDataSet: TClientDataSet;
 ClientDataSetCODANO: TFMTBCDField;
 ClientDataSetANOLET: TFMTBCDField;
 ClientDataSetINIANO: TSQLTimeStampField;
 ClientDataSetFINANO: TSQLTimeStampField;
 ClientDataSetSITANO: TWideStringField;
 DataSource: TDataSource;
 tdbAnoLetivo: TDBText;
 procedure btFecharClick(Sender: TObject);
 procedure btIncluirClick(Sender: TObject);
 procedure btCancelarClick(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 procedure LimparCampos;
 function ValidarCampos :boolean;
 public
 { Public declarations }

 end;

 var
 frmCadAnoLetivo: TfrmCadAnoLetivo;

 implementation

 {$R *.dfm}

 uses CLCadAnoLetivo, DMAnoLetivo;

 var FAnoLetivo : TAnoLetivo;
 {Procedimentos de iniialização e rotinas de limpeza de campos}
 procedure TfrmCadAnoLetivo.LimparCampos;
 begin
 cboCodAnoLetivo.Clear;
 txtAnoLetivo.Clear;
 txtDataInicio.Clear;
 txtDataFim.Clear;
 cboSituacao.Clear;
 end;

 {Proedimentos de validação de campo}
 function TfrmCadAnoLetivo.ValidarCampos:boolean;
 begin
 ValidarCampos := true;

 if 

Re: [delphi-br] POO em 3 camadas

2010-07-20 Por tôpico Marcos Bernardo
Olá a Todos...
As vezes tentamos entender os codigos postados e fica meio confuso dever o
codigo no email

Como sugestão... peço aos amigos colaboradores... postar os codigo em
http://pastebin.com

assim facilia bastante..
como exemplo sego o codigo de nosso amigo...

So uma Sugestão hein..heheh =D

abraço
Marcos Bernardo


Em 19 de julho de 2010 23:32, Pedro de Souza pedros...@yahoo.com.brescreveu:



 Boa noite pessoal, programei por vários anos em VB6 e depois de um tempo
 sem programar estou voltando a ativa com o D2010.
 Aprendi rápido o básico como a sintaxe e os componentes, mais estou tendo
 problemas com POO em 3 camadas. Estou fazendo um cadastro simples onde tenho
 o seguinte cenário:

 1 DataModule : TSQLConnection, TSQLTable, TSQLStoredProc
 1 Form: DataSetprovider, ClientDataSet, DataSource, DBNavigator, os campos
 das tabelas DBEdit, TDBComboBox e os botões de ação incluir, excluir, etc...
 1 Unit: que é a minha classe.

 Consigo navegar pelos regiostros mais quando tento fazer o cadastro recebo
 a seguinte mensagem: Access violation at address 0060680C in module
 'Cadastro.exe' Write of address 0004.
 Pesquisando percebi que a referência da minha classe está como nil quanto
 chamo o método incluir, mais como carregar a classe corretamente? Me
 corrijam se eu estiver errado.
 Segue abaixo o código que estou usando:
 A parte em negrito no form é onde acontece o erro. Coloquei um if para
 tratar o erro mais como corrigir?
 Desde já agradeço a ajuda de vocês.

 DATAMODULE:
 unit DMAnoLetivo;

 interface

 uses
 SysUtils, Classes, DSConnect, DBClient, SConnect, DB, MConnect,
 WideStrings,
 DBXOracle, SqlExpr, FMTBcd, CLCadAnoLetivo, Dialogs;

 type
 TDTMAnoLetivo = class(TDataModule)
 ConnR110ANO: TSQLConnection;
 TableR110ANO: TSQLTable;
 SpR110ANO: TSQLStoredProc;
 TableR110ANOCODANO: TFMTBCDField;
 TableR110ANOANOLET: TFMTBCDField;
 TableR110ANOINIANO: TSQLTimeStampField;
 TableR110ANOFINANO: TSQLTimeStampField;
 TableR110ANOSITANO: TWideStringField;
 private
 { Private declarations }
 public
 { Public declarations }
 function Incluir(FCodAno :TAnoLetivo):Boolean;
 end;

 var
 dtmAnoLetivo: TDTMAnoLetivo;

 implementation

 {$R *.dfm}

 {TDTMAnoLetivo}

 function TDTMAnoLetivo.Incluir(FCodAno :TAnoLetivo):Boolean;
 begin
 result := false;
 try
 if not ConnR110ANO.Connected then
 ConnR110ANO.Open;

 if spR110ANO.Active then
 spR110ANO.Close;

 spR110ANO.ClearFields;

 spR110ANO.StoredProcName := 'spCadAnoLetivo';

 spR110ANO.Params.ParamByName('p_CodAno').Value := FCodAno.CodAno;
 spR110ANO.Params.ParamByName('p_AnoLet').Value := FCodAno.AnoLet;
 spR110ANO.Params.ParamByName('p_IniAno').Value := FCodAno.IniAno;
 spR110ANO.Params.ParamByName('p_FinAno').Value := FCodAno.FinAno;
 spR110ANO.Params.ParamByName('p_SitAno').Value := FCodAno.SitAno;

 spR110ANO.ExecProc;
 result := true;
 except
 on e:exception do
 ShowMessage('Houve um problema de comunicação com o banco de dados!');
 end;
 end;

 end.

 FORM:
 unit frmCadAnoLetivoUnit;

 interface

 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, RzBckgnd, RzBorder, ExtCtrls, DBCtrls,
 Buttons,
 Mask, DB, DBClient, Provider;

 type
 TfrmCadAnoLetivo = class(TForm)
 Label2: TLabel;
 Label1: TLabel;
 RzBorder: TRzBorder;
 RzSeparator: TRzSeparator;
 StatusBar: TStatusBar;
 Label3: TLabel;
 Label4: TLabel;
 DBNavigator: TDBNavigator;
 btAlterar: TBitBtn;
 btCancelar: TBitBtn;
 btExcluir: TBitBtn;
 btAjuda: TBitBtn;
 btFechar: TBitBtn;
 btPesquisar: TBitBtn;
 btIncluir: TBitBtn;
 Label5: TLabel;
 cboSituacao: TDBComboBox;
 txtDataFim: TDBEdit;
 txtDataInicio: TDBEdit;
 txtAnoLetivo: TDBEdit;
 cboCodAnoLetivo: TDBComboBox;
 DataSetProvider: TDataSetProvider;
 ClientDataSet: TClientDataSet;
 ClientDataSetCODANO: TFMTBCDField;
 ClientDataSetANOLET: TFMTBCDField;
 ClientDataSetINIANO: TSQLTimeStampField;
 ClientDataSetFINANO: TSQLTimeStampField;
 ClientDataSetSITANO: TWideStringField;
 DataSource: TDataSource;
 tdbAnoLetivo: TDBText;
 procedure btFecharClick(Sender: TObject);
 procedure btIncluirClick(Sender: TObject);
 procedure btCancelarClick(Sender: TObject);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 procedure LimparCampos;
 function ValidarCampos :boolean;
 public
 { Public declarations }

 end;

 var
 frmCadAnoLetivo: TfrmCadAnoLetivo;

 implementation

 {$R *.dfm}

 uses CLCadAnoLetivo, DMAnoLetivo;

 var FAnoLetivo : TAnoLetivo;
 {Procedimentos de iniialização e rotinas de limpeza de campos}
 procedure TfrmCadAnoLetivo.LimparCampos;
 begin
 cboCodAnoLetivo.Clear;
 txtAnoLetivo.Clear;
 txtDataInicio.Clear;
 txtDataFim.Clear;
 cboSituacao.Clear;
 end;

 {Proedimentos de validação de campo}
 function TfrmCadAnoLetivo.ValidarCampos:boolean;
 begin
 ValidarCampos := true;

 if txtAnoLetivo.Text = '' then
 begin
 Application.MessageBox('O campo ano letivo não pode estar vazio!',
 'Alerta', MB_ICONEXCLAMATION);
 ValidarCampos := false;