Fórum Objeto se destroi sozinho #375276
24/09/2009
0
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
Curtir tópico
+ 0Posts
25/09/2009
Afarias
Como vc está criando o ´objeto´? Como ele está declarado no DataModule??
T+
Gostei + 0
25/09/2009
Et.vinny
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.
Gostei + 0
25/09/2009
Afarias
Tb, no destructor ou no OnDestroy, destrua o objeto
T+
Gostei + 0
25/09/2009
Et.vinny
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)