Fórum Erro Com Criação de TDataModule #421896
17/08/2012
0
Segue abaixo os eventos do Formulario
OnCreate
if not Assigned(DmExpedicao) then
DmExpedicao := TDmExpedicao.Create(Self);
OnClose
Action := caFree;
OnDestroy
DmExpedicao.CdsCargas.Close;
Alguém já passou por isso? Alguém pode me ajudar?
Sidney Abreu
Curtir tópico
+ 0Posts
17/08/2012
William
Esse Access Violation é disparado em qual momento?
Gostei + 0
18/08/2012
Marco Salles
Delphi , pq ele indicou o form para ser o Pai do TdataModulo
DmExpedicao := TDmExpedicao.Create(Self);
Eu tb sugiro tentar colocar a instrução DmExpedicao:=nil;
OnDestroy
DmExpedicao.CdsCargas.Close;
DmExpedicao:=nil;
Gostei + 0
18/08/2012
William
Gostei + 0
18/08/2012
Sidney Abreu
Gostei + 0
18/08/2012
Sidney Abreu
Gostei + 0
18/08/2012
Marco Salles
Legal. eu conheço TDI e particularmnte acho útil . Mas tem alguns conceitos que me parecem confusos
1) eu não posso dar um NIL pq ele vai destruir totalmente
O Nil , não destroy nada
Quando vc testa
if not Assigned(DmExpedicao) then
DmExpedicao := TDmExpedicao.Create(Self);
Vc esta testando se o DmExpedicao não é Nil e não se ele existe ou deixa de existir. Ele pode ser <> nil e não
esta instanciado
veja um exemplo simples
var
Obj:TEdit; //pode ser qualquer classe
begin
if obj <> nil then
showmessage('como pode ser <> nil se eu não instanciei ???'); // Veja que a instrução é executada
2)se eu fechar o Formulário de cargas e der um NIL o formulário de expedição
O correto é vc ter para cada formulário um Campo apontando para este DataModulo
public
FDmExpedicao:TDataModule
...
Instancia ele no oncreate ou onshow
FDmExpedicao := TDmExpedicao.Create(Self);
usa e deixa o Ondetroy se encarregar do Resto
ps) Apesar de pouco utilizado esta arquitetura é mais indicada . Posso entrar mais no merito da questão se for o caso
3)
se eu fechar o Formulário de cargas e der um NIL o formulário de expedição que ainda estou usando vai dar acesses violation quando eu precisar usar algum filtro pois o TDmExpedicao estará destruído.
Mas no seu código não é O nil que o esta destruindo ... E o Proprio formulário que destroe todos os seus filhos
veja o que eu disse para o will
Delphi , pq ele indicou o form para ser o Pai do TdataModulo
DmExpedicao := TDmExpedicao.Create(Self);
O parametro sel no constructor esta dizendo que o proprietário de DmExpedicao é o próprio form (self), logo quando vc
fecha o formulario e o libera da memória (action) , automaticamente ele Libera todos os objetos filhos
Por isto que vc recebe Acesso Violado ... Entendeu ?????
Gostei + 0
18/08/2012
Sidney Abreu
Gostei + 0
18/08/2012
Marco Salles
è recomendação , apesar de pouco utilizado
estranho...
Se este formulário for reaberto e não recriado , vc deveria ter feito as verificações no onshow e não no oncreate
Neste caso como o DmExpedicao sera Nil , vc o estaria Recriando
no OnShow
if not Assigned(DmExpedicao) then
DmExpedicao := TDmExpedicao.Create(Self);
Mas de qualquer forma esta tudo ok agora
Gostei + 0
18/08/2012
Sidney Abreu
Gostei + 0
18/08/2012
Marco Salles
só corrigindo
2)se eu fechar o Formulário de cargas e der um NIL o formulário de expedição
O correto é vc ter para cada formulário um Campo apontando para este DataModulo
public /////////////////////// o correto é Private
FDmExpedicao:TDataModule
[]sds
Gostei + 0
19/08/2012
Sidney Abreu
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)