ACCESS VIOLATION
Meus caros estou com um grande problema ou resolvo ou to fora.
É o seguinte em meus softwares uso uma função para criar os forms que chamo do menu principal e também utilizo essa mesma função em alguns casos para criar outros forms chamados apartir de alguns outros.
O código da função é o seguinte:
{procedure CriaForm
propósito : Criação generica dos forms da aplicacao
Parametros:-
TF = Classe pai do formulário
Dono = Proprietário do form (application, sender, self);
Formulario = Formulário a ser criado
ATENCAO : O parametro Formulario tem que ser passado como um typecast para
a classe TFormClass
}
procedure TfrmMenu.CriaForm(TF : TFormClass; var Formulario : TFormClass);
begin
if not Assigned(Formulario) then
begin
Screen.Cursor := crHourGlass;
Application.CreateForm(TF, Formulario);
Screen.Cursor := crDefault;
end;
TForm(Formulario).Show;
end;
A situação é a seguinte, tenho um form frmPedidosFaturar onde seleciono um pedido e dou um clique e chamo o frmNotaSaida utilizando a função acima.
procedure TfrmPedidosFaturar.tfXPButton4Click(Sender: TObject);
begin
frmMenu.CriaForm(TfrmNotaSaida, TFormClass(frmNotaSaida));
qrPedidos.Close;
qrPedidos.Open;
end;
Até aqui sem problemas.
O problema acontece quando fecho o frmNotaSaida
procedure TfrmNotaSaida.Action1Execute(Sender: TObject);
begin
Close;
end;
procedure TfrmNotaSaida.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
Assert(Assigned(frmNotaSaida) and frmNotaSaida.visible);
frmNotaSaida := nil;
end;
Ele passa pelo Close e pelo evento onClose e antes de sair ele me retorna a seguinte mensagem:
É o seguinte em meus softwares uso uma função para criar os forms que chamo do menu principal e também utilizo essa mesma função em alguns casos para criar outros forms chamados apartir de alguns outros.
O código da função é o seguinte:
{procedure CriaForm
propósito : Criação generica dos forms da aplicacao
Parametros:-
TF = Classe pai do formulário
Dono = Proprietário do form (application, sender, self);
Formulario = Formulário a ser criado
ATENCAO : O parametro Formulario tem que ser passado como um typecast para
a classe TFormClass
}
procedure TfrmMenu.CriaForm(TF : TFormClass; var Formulario : TFormClass);
begin
if not Assigned(Formulario) then
begin
Screen.Cursor := crHourGlass;
Application.CreateForm(TF, Formulario);
Screen.Cursor := crDefault;
end;
TForm(Formulario).Show;
end;
A situação é a seguinte, tenho um form frmPedidosFaturar onde seleciono um pedido e dou um clique e chamo o frmNotaSaida utilizando a função acima.
procedure TfrmPedidosFaturar.tfXPButton4Click(Sender: TObject);
begin
frmMenu.CriaForm(TfrmNotaSaida, TFormClass(frmNotaSaida));
qrPedidos.Close;
qrPedidos.Open;
end;
Até aqui sem problemas.
O problema acontece quando fecho o frmNotaSaida
procedure TfrmNotaSaida.Action1Execute(Sender: TObject);
begin
Close;
end;
procedure TfrmNotaSaida.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
Assert(Assigned(frmNotaSaida) and frmNotaSaida.visible);
frmNotaSaida := nil;
end;
Ele passa pelo Close e pelo evento onClose e antes de sair ele me retorna a seguinte mensagem:
Tadeu Oliveira
Curtidas 0
Respostas
Pjrm1470
07/01/2010
Colega, fiz um teste com o mesmo codigo que você mostrou. Não obtive nenhum erro. Já debugou para ver em que linha acontece o erro? Fica até mais facil da gente compreender o que acontece.
Alias, estou curioso quanto a uma linha... "Assert(Boolean)". Pra que vc usa a linha ? Vi no help do delphi o significado mas gostaria de saber o porque o usa. Ps.:"Não vi nada de mais em usa-lo e não usa-lo".
Aguardo.
pjrm1470.
GOSTEI 0
Emerson Nascimento
07/01/2010
você não tem nada no Evento OnDestroy?
Se houver alguma implmentação no OnDestroy, ele deve esperar que o form ainda esteja instanciado, mas você o está destruindo na última linha do evento OnClose.
Como teste, tire a linha FrmNotaSaida := nil do OnClose e veja se o problema persiste.
Se houver alguma implmentação no OnDestroy, ele deve esperar que o form ainda esteja instanciado, mas você o está destruindo na última linha do evento OnClose.
Como teste, tire a linha FrmNotaSaida := nil do OnClose e veja se o problema persiste.
GOSTEI 0
Tadeu Oliveira
07/01/2010
Essa linha eu utilizei atraves de um exemplo que vi no forum antigo e falando sério não sei tabém qual sua funcionalidade neste caso.
Foi apenas mais uma tentativa de resolver o problema e ela inclusive já não existe mais no código.
Quanto a debugar foi a primeira coisa que fiz e o mais estranho é que ele passa por todo esse código ai e não exibe a mensagem quando está neste ponto e sim no código abaixo:
Foi apenas mais uma tentativa de resolver o problema e ela inclusive já não existe mais no código.
Quanto a debugar foi a primeira coisa que fiz e o mais estranho é que ele passa por todo esse código ai e não exibe a mensagem quando está neste ponto e sim no código abaixo:
GOSTEI 0
Pjrm1470
07/01/2010
"Se de um jeito não vai, então vai na marra."
Quando não mostra em qual linha que foi o erro, o jeito é colocar pra debugar TODAS as functions e procedures da unit. E utilize F7 em vez de F8. Com o F7 vc ve exatamente por dentro de cada função ou procedimento chamado. Isso irá lhe consumir um tempo, mas você verá aonde está acontecendo o erro.
Dê uma debugada profunda aí pra vc ver (rs). Todo acesso violado tem uma origem, é so ir mais fundo que vc descobre.
GOSTEI 0
Emerson Nascimento
07/01/2010
deixe no OnClose apenas a linha Action := caFree e veja o que acontece.
GOSTEI 0
Tadeu Oliveira
07/01/2010
deixei apenas a linha Action := caFree; e o erro persiste.
Quanto a debugar todas as linha com F7 como sujeriu o colega Plinio ainda não o fiz por falta de tempo mesmo mas vou efetuar este teste amanhã sabado que estarei mais tranquilo sem telefone e sem ninguem me chamando rsrsrs.
Desde já agradeço a colaboração de todos os colegas e continuo aberto a mais sujestões.
Obrigado.
Quanto a debugar todas as linha com F7 como sujeriu o colega Plinio ainda não o fiz por falta de tempo mesmo mas vou efetuar este teste amanhã sabado que estarei mais tranquilo sem telefone e sem ninguem me chamando rsrsrs.
Desde já agradeço a colaboração de todos os colegas e continuo aberto a mais sujestões.
Obrigado.
GOSTEI 0
Tadeu Oliveira
07/01/2010
Meu caro Plinio.
Segui o sua dica e consegui descobrir de onde vem o erro só não defini qual solução vou dar ao problema.
Este form que da este erro é o Form que emite a nota eletrônica e para tal utilizo os componentes do ACBr que na minha opnião são muito bons porém o erro está dando na unit do ACBrValidador que faz a validação dos cnpj, cpf e inscrições Estaduais alem de outros documentos.
Não sei talvez uma atualização do componente resolva.
Tem alguma sujestão?
Abraço e obrigado mais uma vez
Segui o sua dica e consegui descobrir de onde vem o erro só não defini qual solução vou dar ao problema.
Este form que da este erro é o Form que emite a nota eletrônica e para tal utilizo os componentes do ACBr que na minha opnião são muito bons porém o erro está dando na unit do ACBrValidador que faz a validação dos cnpj, cpf e inscrições Estaduais alem de outros documentos.
Não sei talvez uma atualização do componente resolva.
Tem alguma sujestão?
Abraço e obrigado mais uma vez
GOSTEI 0
Pjrm1470
07/01/2010
É... O bom de fazer este debug mais profundo, é que acamos aprendendo coisas que tem em funcções e procedimentos que nem pensariamos em usa-los.
É como você disse, so atualizando os componenter dele ou alguem que use o componente, lhe ajudar.
Que bom que consegui lhe ajuda. Boa sorte aí na solução.
Att, pjrm1470.
Att, pjrm1470.
GOSTEI 0
Tadeu Oliveira
07/01/2010
Caros colegas.
O problema já foi resolvido da seguinte maneira.
Removi Action := caFree; e frmNotasSaida := nil; do evento onClose do form frmNotasSaida.
No form frmPedidosFaturar antes de fazer a chamada para frmNotasSaida deixei da seguinte forma:
if frmNotasSaida <> nil then
frmNotasSaida := nil;
CriaForm(TfrmNotasSaida, TFormClass(frmNotasSaida));
E funcionou sem problemas.
Obrigado a todos pela colaboração.
Atenciosamente,
Tadeu
O problema já foi resolvido da seguinte maneira.
Removi Action := caFree; e frmNotasSaida := nil; do evento onClose do form frmNotasSaida.
No form frmPedidosFaturar antes de fazer a chamada para frmNotasSaida deixei da seguinte forma:
if frmNotasSaida <> nil then
frmNotasSaida := nil;
CriaForm(TfrmNotasSaida, TFormClass(frmNotasSaida));
E funcionou sem problemas.
Obrigado a todos pela colaboração.
Atenciosamente,
Tadeu
GOSTEI 0
Tadeu Oliveira
07/01/2010
Galera o problema apenas se transferiu do form da emissão de notas para o principal, agora quando saio do form principal ele exibe a mesma mensagem e o pior trava a máquina do usuário.
Aguardo retorno dos colegas.
Obrigado.
Aguardo retorno dos colegas.
Obrigado.
GOSTEI 0
Tadeu Oliveira
07/01/2010
Problema Resolvido, refiz os forms que estavão causando o problema.
Obrigado a Todos
Obrigado a Todos
GOSTEI 0