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 00000004. 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; txtAnoLetivo.SetFocus; exit; end; if txtDataInicio.Text = '' then begin Application.MessageBox('O campo data inícial não pode estar vazio!', 'Alerta', MB_ICONEXCLAMATION); ValidarCampos := false; txtDataInicio.SetFocus; exit; end; if txtDataFim.Text = '' then begin Application.MessageBox('O campo data final não pode estar vazio!', 'Alerta', MB_ICONEXCLAMATION); ValidarCampos := false; txtDataFim.SetFocus; exit; end; if cboSituacao.Text = '' then begin Application.MessageBox('O campo situação não pode estar vazio!', 'Alerta', MB_ICONEXCLAMATION); ValidarCampos := false; exit; end; end; procedure TfrmCadAnoLetivo.btCancelarClick(Sender: TObject); begin btIncluir.Caption := '&Incluir'; btAlterar.Enabled := true; btExcluir.Enabled := true; cboCodAnoLetivo.Enabled := true; DBNavigator.Enabled := true; end; procedure TfrmCadAnoLetivo.btFecharClick(Sender: TObject); begin close; end; procedure TfrmCadAnoLetivo.btIncluirClick(Sender: TObject); begin if btIncluir.Caption = '&Incluir' then begin btIncluir.Caption := '&Salvar'; btAlterar.Enabled := false; btExcluir.Enabled := false; cboCodAnoLetivo.Enabled := false; DBNavigator.Enabled := false; cboCodAnoLetivo.Text := '0'; txtAnoLetivo.Clear; txtDataInicio.Clear; txtDataFim.Clear; cboSituacao.Clear; txtAnoLetivo.SetFocus; end else begin if not ValidarCampos then exit; if FAnoLetivo <> nil then begin FAnoLetivo.Create; FAnoLetivo.CodAno := StrToInt(cboCodAnoLetivo.Text); FAnoLetivo.AnoLet := StrToInt(txtAnoLetivo.Text); FAnoLetivo.IniAno := txtDataInicio.Text; FAnoLetivo.FinAno := txtDataFim.Text; FAnoLetivo.SitAno := cboSituacao.Text; FAnoLetivo.Incluir; end; btIncluir.Caption := '&Incluir'; btAlterar.Enabled := true; btExcluir.Enabled := true; cboCodAnoLetivo.Enabled := true; DBNavigator.Enabled := true; end; end; procedure TfrmCadAnoLetivo.FormCreate(Sender: TObject); begin LimparCampos; end; end. UNIT: unit CLCadAnoLetivo; interface uses Classes, DateUtils, Sysutils; type TAnoLetivo = class private {Aqui poderia ficar os métodos privados} FCodAno :integer; FAnoLet :integer; FIniAno :string; FFinAno :string; FSitAno :string; FAnoLetivo :TAnoLetivo; procedure SetCodAno(CodAno :integer); function GetCodAno :integer; procedure SetAnoLet(AnoLet :integer); function GetAnoLet :integer; procedure SetIniAno(IniAno :string); function GetIniAno :string; procedure SetFinAno(FinAno :string); function GetFinAno :string; procedure SetSitAno(SitAno :string); function GetSitAno :string; published public {Construtores e Destrutores} constructor Create; destructor Destroy; override; {Métodos} function Incluir:Boolean; function Alterar(CodAno :integer) :boolean; function Exluir(CodAno :integer) :boolean; procedure CarregarComboAnoLetivo; procedure Clear; {Propriedades} property CodAno :integer read GetCodAno write SetCodAno; property AnoLet :integer read GetAnoLet write SetAnoLet; property IniAno :string read GetIniAno write SetIniAno; property FinAno :string read GetFinAno write SetFinAno; property SitAno :string read GetSitAno write SetSitAno; property AnoLetivo :TAnoLetivo read FAnoLetivo write FAnoLetivo; end; implementation {TAnoLetivo} uses DMAnoLetivo; procedure TAnoLetivo.SetCodAno(CodAno: integer); begin FCodAno := CodAno; end; function TAnoLetivo.GetCodAno :integer; begin GetCodAno := FCodAno; end; procedure TAnoLetivo.SetAnoLet(AnoLet: integer); begin FAnoLet := AnoLet; end; function TAnoLetivo.GetAnoLet :integer; begin GetAnoLet := FAnoLet; end; procedure TAnoLetivo.SetIniAno(IniAno: string); begin FIniAno := IniAno; end; function TAnoLetivo.GetIniAno :string; begin GetIniAno := FIniAno; end; procedure TAnoLetivo.SetFinAno(FinAno: string); begin FFinAno := FinAno; end; function TAnoLetivo.GetFinAno :string; begin GetFinAno := FFinAno; end; procedure TAnoLetivo.SetSitAno(SitAno: string); begin FSitAno := SitAno; end; function TAnoLetivo.GetSitAno :string; begin GetSitAno := FSitAno; end; constructor TAnoletivo.Create; begin inherited; CodAno := 0; AnoLet := 0; IniAno := ''; FinAno := ''; SitAno := ''; FAnoLetivo.Clear; end; destructor TAnoLetivo.Destroy; begin FAnoLetivo.Free; inherited; end; function TAnoLetivo.Incluir:Boolean; begin dtmAnoLetivo.Incluir(Self); end; function TAnoLetivo.Alterar(CodAno :integer): Boolean; begin end; function TAnoLetivo.Exluir(CodAno :integer): Boolean; begin end; procedure TAnoLetivo.CarregarComboAnoLetivo; begin end; procedure TAnoLetivo.Clear; begin CodAno := 0; AnoLet := 0; IniAno := ''; FinAno := ''; SitAno := ''; end; end. [As partes desta mensagem que não continham texto foram removidas] Click here <https://www.mailcontroller.altohiway.com/sr/aJum6RcxEfvTndxI!oX7UkcP8LU!1h0Mh!Ns5q2Dlq4erK78xODJFdP5USxZszxRdzmLemWThgTvspMJDgpPug==> to report this email as spam. This message has been scanned for viruses by MailController <http://www.MailController.altohiway.com/> . [As partes desta mensagem que não continham texto foram removidas]