ACCESS VIOLATION

07/01/2010

4

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:





 
Responder

Posts

07/01/2010

Pjrm1470

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.
Responder
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.
Responder

07/01/2010

Tadeu Oliveira

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:

Responder

07/01/2010

Pjrm1470

"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.
Responder
deixe no OnClose apenas a linha Action := caFree e veja o que acontece.
Responder

08/01/2010

Tadeu Oliveira

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.
Responder

08/01/2010

Tadeu Oliveira

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

Responder

08/01/2010

Pjrm1470

É... 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.
Responder

13/01/2010

Tadeu Oliveira

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
Responder

19/01/2010

Tadeu Oliveira

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.
Responder

20/01/2010

Tadeu Oliveira

Problema Resolvido, refiz os forms que estavão causando o problema.

Obrigado a Todos

Responder