Erro de Acces violation...
Caros colegas...
Estou com um problema na liberação de uma tela de cadastro.
O sistema tem um menu, EXE, e uma DLL que contem os cadastros.
Até aí tudo bem... ele abre a tela, cadastra salva.. tudo certo, mas...
em algumas situações que ainda não consegui descubrir ele apresenta um erro de ´Access violation at address 00ADC9C4 in module ´Administracao.dll´. Read of address 0A641448´ e trava, isso ocorre depois de ele entrar no evento onDestroy do Módulo de Dados da DLL (Que contem a camada de acesso ao Banco de Dados...)
Segue trecho do Código...
-------------------------------------------------------------------------------------
{Criação do Formulário...}
procedure TFCad_BancoTalentos.FormCreate(Sender: TObject);
begin
{Centraliza o Fomulário...}
CentralizaFrm(TForm(Self));
DmAdministracao:=TDmAdministracao.Create(Application);
DMAdministracao.QryConsEmpresas.Open;
DMAdministracao.QryBancoTalentos.Open;
DMAdministracao.QryBancoTalentos_Referencia.Open;
end;
-------------------------------------------------------------------------------------
{Finalização do Formulário...}
procedure TFCad_BancoTalentos.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if DmAdministracao <> nil then
begin
if DmAdministracao.QryBancoTalentos.State in [dsInsert,dsEdit] then
DMAdministracao.QryBancoTalentos.Post;
{Aplica as Aterações no Servidor}
DmAdministracao.TrAdministracao.CommitRetaining;
{-------------------------}
DMAdministracao.QryBancoTalentos.Close;
DMAdministracao.QryConsEmpresas.Close;
DmAdministracao.Free
end;
Action:=CaFree;
FCad_BancoTalentos := Nil;
end;
-------------------------------------------------------------------------------------
{Finalização do Módulo...}
procedure TDMAdministracao.DataModuleDestroy(Sender: TObject);
begin
if DMAdministracao <> nil then
begin
if TrAdministracao.InTransaction then
TrAdministracao.Commit;
end;
end;
Não sei se alguem da Lista já passou por isso, o que irrita é que não há uma regra, as vezes aparece o erro, as vezes não...
Uso o Delphi 5 SP1, IBX para acessar o Banco, Firebird 1.5.2 e SO é XP SP 2.
Agradeço a atenção...
Estou com um problema na liberação de uma tela de cadastro.
O sistema tem um menu, EXE, e uma DLL que contem os cadastros.
Até aí tudo bem... ele abre a tela, cadastra salva.. tudo certo, mas...
em algumas situações que ainda não consegui descubrir ele apresenta um erro de ´Access violation at address 00ADC9C4 in module ´Administracao.dll´. Read of address 0A641448´ e trava, isso ocorre depois de ele entrar no evento onDestroy do Módulo de Dados da DLL (Que contem a camada de acesso ao Banco de Dados...)
Segue trecho do Código...
-------------------------------------------------------------------------------------
{Criação do Formulário...}
procedure TFCad_BancoTalentos.FormCreate(Sender: TObject);
begin
{Centraliza o Fomulário...}
CentralizaFrm(TForm(Self));
DmAdministracao:=TDmAdministracao.Create(Application);
DMAdministracao.QryConsEmpresas.Open;
DMAdministracao.QryBancoTalentos.Open;
DMAdministracao.QryBancoTalentos_Referencia.Open;
end;
-------------------------------------------------------------------------------------
{Finalização do Formulário...}
procedure TFCad_BancoTalentos.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if DmAdministracao <> nil then
begin
if DmAdministracao.QryBancoTalentos.State in [dsInsert,dsEdit] then
DMAdministracao.QryBancoTalentos.Post;
{Aplica as Aterações no Servidor}
DmAdministracao.TrAdministracao.CommitRetaining;
{-------------------------}
DMAdministracao.QryBancoTalentos.Close;
DMAdministracao.QryConsEmpresas.Close;
DmAdministracao.Free
end;
Action:=CaFree;
FCad_BancoTalentos := Nil;
end;
-------------------------------------------------------------------------------------
{Finalização do Módulo...}
procedure TDMAdministracao.DataModuleDestroy(Sender: TObject);
begin
if DMAdministracao <> nil then
begin
if TrAdministracao.InTransaction then
TrAdministracao.Commit;
end;
end;
Não sei se alguem da Lista já passou por isso, o que irrita é que não há uma regra, as vezes aparece o erro, as vezes não...
Uso o Delphi 5 SP1, IBX para acessar o Banco, Firebird 1.5.2 e SO é XP SP 2.
Agradeço a atenção...
Dessis Empresarial
Curtidas 0
Respostas
Andremuller
18/03/2005
Algumas coisas que tu deve lembrar.
NUNCA usar variáveis globais, delete toda clausa var da classe
tipo
var
frmCad: TfrmCad
deleta isso e trabalha com propriedades.
Declara como primeira unit, tanto no exe que chama a dll, quanto na dll a unit ShareMem.
Pelo que me lembre esses são os maiores empecilhos.
Faz isso e vamos ver se resolve.
NUNCA usar variáveis globais, delete toda clausa var da classe
tipo
var
frmCad: TfrmCad
deleta isso e trabalha com propriedades.
Declara como primeira unit, tanto no exe que chama a dll, quanto na dll a unit ShareMem.
Pelo que me lembre esses são os maiores empecilhos.
Faz isso e vamos ver se resolve.
GOSTEI 0
Dessis Empresarial
18/03/2005
Pois é amigo, fiz o que sugeriu, inserí a unit ShareMem e deletei o var que tinhas a Variável Publica e mesmo assim, dá erro na finalização do Data Module, tá estranho... parece piada... mas observei que quando entro em outro módulo do sistema... fecho e entro no Administração (Tela que relatei o problema...) o erro não ocorre... , se entro no sistema e vou diretamenta na tela do Administração, e entro...cadastro o que for necessário, mas quando saiu ele apresenta o erro de violação de acesso na Finalização do Módulo, ele entrar no onDestroy mas falha a liberação da memória....
Agradeço sua atenção...
Agradeço sua atenção...
GOSTEI 0