Fórum Objeto se destroi sozinho #375276

24/09/2009

0

E ai galera estou eu aqui para tirar mais uma dúvida.
O seguinte criei um objeto ´ModuleConfig´, em um TDataModule. Deste TDataModule, herdo ele e vou criando os outros TDataModule do sistema.

Porém o objeto ´ModuleConfig´, é criado no DataModule principal, e herdados nos outros.

O problema é que este objeto vem como nil, quando chamado no evento AfterOpen do DataModule principal, e se for em outro lugar ele estpa correto.

Eu vi o endereço de memoria em ambos os casos, e são diferentes.

Aonde deve estar o erro?

[]s

Marlon


Et.vinny

Et.vinny

Responder

Posts

25/09/2009

Afarias

Desculpe não entendi nada. AfterOpen é um evento do DataModule??

Como vc está criando o ´objeto´? Como ele está declarado no DataModule??



T+


Responder

Gostei + 0

25/09/2009

Et.vinny

O objeto é uma varivel public do DataModule. O AfterOpen é o evendo de um TSqlQuery, que está dentro deste datamodule. os demais data modules herdam deste datamodule.

Além do datamodule, tenho um TForm para Pesquisa e Cadastro, que o sistema herda respectivamente.

O estranho é que somente no AfterOpen ele não funciona.

Segue código do dmGeral.


unit dGeral;

interface

uses
  SysUtils, Classes, Forms, unBiblioteca, unClasses, FMTBcd, DB, SqlExpr,
  Controls, Dialogs;

type
  TdmGeral = class(TDataModule)
    qryEdicao: TSQLQuery;
    qryLista: TSQLQuery;
    procedure qryEdicaoAfterOpen(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
    FPesquisa : TForm;
    FCadastro : TForm;
    Module : TModuleConfig;


    procedure prOpenModule(Action : TActions);
    procedure OpenRegister();
  protected

     procedure FormStartUp(); virtual;
  end;

var
  dmGeral: TdmGeral;

implementation

uses FrmCadastro, FrmPesquisa;


{$R *.dfm}

{ TdmGeral }

procedure TdmGeral.FormStartUp;
begin
   { Eventos genéricos }
   
end;

procedure TdmGeral.OpenRegister;
var
   _rstrSQL, _rstrSelect, _rstrWhere  : String;
   _rintTemp : Integer;
begin

   for _rintTemp := 0 to Length(Module.SQL.PKValues) - 1 do
   begin
      if _rintTemp > 0 then _rstrWhere := _rstrWhere + ´ AND ´;
      _rstrWhere := _rstrWhere +  Module.SQL.PKValues[_rintTemp];
   end;
   _rstrSelect := ´´;
   for _rintTemp := 0 to Length(Module.SQL.FieldsSelectRegister) - 1 do
   begin
      if _rintTemp > 0 then _rstrSelect := _rstrSelect + ´ , ´;
      _rstrSelect := _rstrSelect +  Module.SQL.FieldsSelectRegister[_rintTemp];
   end;


   _rstrSQL :=
      ´ SELECT ´  +
      ´        ´  + _rstrSelect + 
      ´ FROM   ´  +
      ´   ´       + Module.SQL.TableMain +
      ´ WHERE  ´  +
      ´   ´       + _rstrWhere;

   TFormCadastro(FCadastro).cdsEdicao.Close;
   qryEdicao.SQL.Text := _rstrSQL;
   TFormCadastro(FCadastro).cdsEdicao.Open;

   TFormCadastro(FCadastro).pgcControle.ActivePage := TFormCadastro(FCadastro).tabCadastro;
end;

procedure TdmGeral.prOpenModule(Action: TActions);
begin
   { Criando o modulo de configuração }
   Module := TModuleConfig.Create;
   { Inicalização do módulo. É feito nos DM herdados }
   FormStartUp;

   TFormPesquisa(FPesquisa).ModuleP := Module;
   TFormPesquisa(FPesquisa).FormInitialization;

   TFormCadastro(FCadastro).Module := Module;

   { Adicionando o Form de Pesquisa dentro da tela de Cadastros }
   FPesquisa.ManualDock(TFormCadastro(FCadastro).tabPesquisa);
   FPesquisa.Align := alClient;
   FPesquisa.Show;

   prSetNullFields(Module, FCadastro);  // ------> Aqui o Module Funciona
   TFormCadastro(FCadastro).pgcControle.ActivePage := TFormCadastro(FCadastro).tabPesquisa;
   { Abrindo o Form de cadastro }
   FCadastro.ShowModal;
end;

procedure TdmGeral.qryEdicaoAfterOpen(DataSet: TDataSet);
begin
   prSetFieldsPK(Module, DataSet);  //----> Aqui o Module não funciona
   qryEdicao.Fields[0].ProviderFlags := [pfInUpdate, pfInWhere, pfInKey];
   qryEdicao.Fields[0].Required := False;
end;

end.


[/b]


Responder

Gostei + 0

25/09/2009

Afarias

Apenas mova a criação do objeto para o lugar correto: O constructor da classe ou até o OnCreate do DataModule.


Tb, no destructor ou no OnDestroy, destrua o objeto


T+


Responder

Gostei + 0

25/09/2009

Et.vinny

Valeu pela dica afarias.
Como dizem, não dá certo sai e vai dar uma volta. e hoje em 5 minutos e depois da sua dica, coloquei um break-point no Create do DataModule, e vi que estava sendo criado duas vezes o DataModule do Cliente. E este DataModule, estava sendo criado via projeto.

Tirei ele do projeto e voltou a funcionar.

[]s,

Marlon


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar