ACCESS VIOLATION
07/01/2010
0
É 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
Posts
07/01/2010
Pjrm1470
07/01/2010
Emerson Nascimento
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.
07/01/2010
Tadeu Oliveira
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:
07/01/2010
Pjrm1470
07/01/2010
Emerson Nascimento
08/01/2010
Tadeu Oliveira
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.
08/01/2010
Tadeu Oliveira
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
08/01/2010
Pjrm1470
Att, pjrm1470.
13/01/2010
Tadeu Oliveira
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
19/01/2010
Tadeu Oliveira
Aguardo retorno dos colegas.
Obrigado.
20/01/2010
Tadeu Oliveira
Obrigado a Todos
Clique aqui para fazer login e interagir na Comunidade :)