Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 3559 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado
NFSe.NotasFiscais.Clear;
NFSe.NotasFiscais.NumeroLote := '1';
NFSe.NotasFiscais.Transacao  := True;
with NFSe.NotasFiscais.Add.NFSe do
   begin

    ....

   end;
NFSe.Enviar('1');

Boa tarde

 

Quando executo este código, ao fechar o form tenho um "invalid pointer operation",

e se clico novamente me dá um Acess Vioalation ao executar o .Clear (primeira linha)...

 

Alguma dica?

Marcos Gerene

[email protected]

Postado

Este erro refere-se a operação com ponteiro.

 

Me parece que você está tentando acessar um endereço na memória que não existe mais ou que não foi criado.

 

O ideal é você marcar um break-point no início da procedure e ir debugando o código, até chegar na linha causadora do problema e verificar a  janela Call Stack os procedimentos anteriormente chamados.

João Leno

Developer In Lunar Tecnologia
Formação: Bacharel em Sistemas de Informação
Pós Graduação: Infraestrutura e aplicações em redes de computadores (Cursando)
Cell: (84) 8135-9585
Skype: joaolenosi
Site: http://lunartecnologia.com.br/

Se não puder vencer pelo o talento, vença pelo o esforço.

Postado (editado)

Ítalo,

 

Eu dei um Ctrl C, Ctrl V do código do botão de gerar e transmitir do Demo,

e pelo que vi do Demo ele executa esse .Clear quando clico no botão

e quando chama a função "AlimentaComponente", ficando algo assim:

evento click do botão:

NFSe.NotasFiscais.Clear;
funcao2
NFSe.NotasFiscais.Enviar(x);
função 2:

NFSe.NotasFiscais.Clear;

NFSe.PropriedadesPai.PropriedadesFilho := Valor
...

Ou seja, ele chama 2x seguidas o .Clear normalmente (isso no Demo, no meu software eu chamo esse .Clear apenas uma

vez e já alimento o componente na mesma função, como descrevi no primeiro post)... 

 

Os objetos na tela copiei do Demo pro meu form também, para aproveitar alguma configuração já feita que

evitasse isso...

 

-----------------------

 

joaolenosi:

 

Quando transmito, ele envia normal, imprime, gera o PDF, faz tudo, porém dá Acess Violation ao fechar o Form,

mas debugando tenho esta resposta:

 

Quando ele faz o NFSe.NotasFiscais.Clear; ao dar um F7 ele executa a destructor NotaFiscal.Destroy e a primeira

linha desse destructor é FNFSe.Free; que chama o destructor TNFSe.Destroy; ai funciona até a linha FPrestadorServico.Free;

que chama o destrutor destructor TDadosPrestador.Destroy; que logo na primeira linha chama o FIdentificacaoPrestador.Free;

aonde mesmo com um F7 não entra, retorna o erro.

 

Ou seja o erro ocorre no destructor TDadosPrestador.Destroy; na primeira linha que é  FIdentificacaoPrestador.Free;

da Unit pnfsNFSe

 

---------------------

Editado por Marcos Spirito

Marcos Gerene

[email protected]

Postado (editado)

Se eu tivesse com um tempinho ia tentar simular, mas vamos lá.

 

Como eu falei anteriormente: Esses erros de acess violation, são causados por acessos a endereços de memória que não existem.

 

Tente desta forma só para testar se realmente o erro se da pelo o fato do prestador não está criado.

 FIdentificacaoPrestador := TIdentificacaoPrestador.Create;
 FIdentificacaoPrestador.Free;
 FEndereco.Free;
 FContato.Free;

 inherited destroy;
Editado por joaolenosi

João Leno

Developer In Lunar Tecnologia
Formação: Bacharel em Sistemas de Informação
Pós Graduação: Infraestrutura e aplicações em redes de computadores (Cursando)
Cell: (84) 8135-9585
Skype: joaolenosi
Site: http://lunartecnologia.com.br/

Se não puder vencer pelo o talento, vença pelo o esforço.

Postado

Melhor, tente desta forma:

 

 

 if Assigned(FIdentificacaoPrestador) then
    FIdentificacaoPrestador.Free;

João Leno

Developer In Lunar Tecnologia
Formação: Bacharel em Sistemas de Informação
Pós Graduação: Infraestrutura e aplicações em redes de computadores (Cursando)
Cell: (84) 8135-9585
Skype: joaolenosi
Site: http://lunartecnologia.com.br/

Se não puder vencer pelo o talento, vença pelo o esforço.

Postado (editado)

João,

 

Em primeiro lugar muito obrigado e sim, funcionou perfeitamente.

 

Eu tinha pensado em comentar a linha com o FIdentificacaoPrestador.Free, já que é chamada no destroy

dos dados do prestador e teoricamente o FIdentificacaoPrestador já está destruído (para dar este erro)

mas estou estranhando o fato de ter acontecido só comigo...

 

O problema pode ser algo que fiz nas chamadas ao componente?

Editado por Marcos Spirito

Marcos Gerene

[email protected]

Postado

De nada, para ser sincero não sei responder só analisando o código.

 

Também existe a hipótese deste erro está acontecendo com mais pessoas, porém você foi o primeiro a relatar.

 

Att,

João Leno

Developer In Lunar Tecnologia
Formação: Bacharel em Sistemas de Informação
Pós Graduação: Infraestrutura e aplicações em redes de computadores (Cursando)
Cell: (84) 8135-9585
Skype: joaolenosi
Site: http://lunartecnologia.com.br/

Se não puder vencer pelo o talento, vença pelo o esforço.

Postado

Achei o erro  :oops:

   Prestador.Cnpj               := FrmPrincipal.QryConfigCONF_CNPJ_EMPRESA.AsString;
   Prestador.InscricaoMunicipal := FrmPrincipal.QryConfigCONF_INSCMUN.AsString;
   Prestador.Senha              := FrmPrincipal.QryConfigCONF_NFSE_SENHA.AsString;
   Prestador.FraseSecreta       := FrmPrincipal.QryConfigCONF_NFSE_FRASESCRETA.AsString;
   Prestador.cUF                := getCodUF(FrmPrincipal.QryConfigCID_UF.AsString);
//   PrestadorServico.IdentificacaoPrestador   := Prestador;   -> Este é o problema (foi só comentar e funcionou)
   PrestadorServico.RazaoSocial              := FrmPrincipal.QryConfigCONF_RAZAO_EMPRESA.AsString;
   PrestadorServico.NomeFantasia             := FrmPrincipal.QryConfigCONF_NOME_EMPRESA.AsString;
   PrestadorServico.Endereco.TipoLogradouro  := ''; //Acesso, Avenida, Rua...
   PrestadorServico.Endereco.Endereco        := FrmPrincipal.QryConfigCONF_ENDERECO.AsString;
   PrestadorServico.Endereco.Numero          := FrmPrincipal.QryConfigCONF_NUMERO.AsString;
   PrestadorServico.Endereco.Complemento     := '';
   PrestadorServico.Endereco.TipoBairro      := '';
   PrestadorServico.Endereco.Bairro          := FrmPrincipal.QryConfigCONF_BAIRRO.AsString;
   PrestadorServico.Endereco.CodigoMunicipio := IntToStr(NFSe.Configuracoes.WebServices.CodigoMunicipio);
   PrestadorServico.Endereco.UF              := FrmPrincipal.QryConfigCID_UF.AsString;
   PrestadorServico.Endereco.CEP             := FrmPrincipal.QryConfigCONF_CEP.AsString;
   PrestadorServico.Endereco.xMunicipio      := FrmPrincipal.QryConfigCID_DESCRICAO.AsString;
   PrestadorServico.Endereco.CodigoPais      := 1058;
   PrestadorServico.Endereco.xPais           := 'BRASIL';
   PrestadorServico.Contato.Telefone         := FrmPrincipal.QryConfigCONF_FONE.AsString;
   PrestadorServico.Contato.Email            := FrmPrincipal.QryConfigCONF_EMAIL.AsString;

Voltei o código do componente ao normal (sem fazer o if que o João disse) e buscando a maneira como estava preenchendo

comentei a linha destacada acima e tudo funcionou perfeitamente  :mrgreen:

 

 

Muito obrigado pela ajuda! Abraços

Marcos Gerene

[email protected]

  • Este tópico foi criado há 3559 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.