RE: [delphi-br] POO em 3 camadas
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
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
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;