Jump to content

Curso Dominando o ACBrMonitor
Novo Módulo Soluções de Varejo
Assine o SAC ACBr em qualquer plano e tenha acesso

Saiba Mais

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba Mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

Clayton Alves

Membros
  • Content Count

    19
  • Joined

  • Last visited

Community Reputation

6 Neutral

About Clayton Alves

  • Rank
    Novato

Recent Profile Visitors

676 profile views
  1. Especificamente no caso do TMedCollection não teriam memory leak já que o TMedCollection é uma TObjectList que é dona de seus itens, ou seja, os itens serão liberados junto com a coleção no momento da liberação. Por fim o trecho abaixo resolveu meu problema de AV, mas é um "workaround" e acredito que a não duplicação desses itens possa ocasionar problemas no futuro. FProd.Assign(ItemXML.Prod); // Ajuste técnico FProd.med.OwnsObjects := False; FProd.med.Clear; FProd.med.OwnsObjects := True; Agradeço o tempo de vocês.
  2. Mas só pra deixar claro, meu problema nem é com a TDetCollection (apesar de para mim estar claro que existe um problema na cópia) e sim com a classe TMedCollection que não implementa o Assign de modo a criar cópias do TMedCollectionItem.
  3. @BigWings sim, o TDetCollection dispara o AV da mesma forma. Veja o projeto de exemplo em anexo. Na minha interpretação, a semântica do método Assign é de Copiar e não de Mover. Conforme consta na documentação do Freepascal: "Assign copies the contents of Source to Self, if the classes of the destination and source classes are compatible." E da embarcadero: "Copies the contents of another, similar object." Sim, as documentações falam do método Assign da classe TPersistent mas não estou me referindo a implementação e sim a semântica. Exemplo que dispara o AV: program Project1; {$APPTYPE CONSOLE} uses //FastMM4, SysUtils, pcnNFe; var Det1, Det2: TDetCollection; begin Det1 := TDetCollection.Create; Det2 := TDetCollection.Create; Det1.New; Det2.Assign(Det1); // Move algumas referências, quando na verdade deveria copiar. WriteLn('Liberando Det1'); Det1.Free; WriteLn('Liberando Det1'); Det2.Free; // <- Access Violation WriteLn('Fim'); end. Project1.dpr
  4. O que estou sugerindo é que o método Assign seja implementado na classe TMedCollection assim como já foi implementado na classe TpagCollection que aliás segue a mesma hierarquia de herança (TACBrObjectList -> TObjectList -> TList).
  5. Entendo. Mas o exemplo que dei foi bem simplificado propositalmente para deixar mais claro o problema. No caso real, eu não instancio um TMedCollection. Eu tenho uma instancia de TDetCollectionItem, que por sua vez tem uma instância de TProd que por sua vez tem uma instancia de TMedCollection. Neste cenário, utilizar o Assign de TDetCollectionItem com outro TDetCollectionItem e posteriormente realizar o Free irá disparar o AV da mesma forma.
  6. var MedicamentosA: TMedCollection; MedicamentosB: TMedCollection; begin MedicamentosA := TMedCollection.Create; MedicamentosB := TMedCollection.Create; MedicamentosA.New; MedicamentosB.Assign(MedicamentosA); MedicamentosA.Free; MedicamentosB.Free; // <-- Access Violation end;
  7. Sim, TList possui um método Assign que não cria cópias das Instâncias de TMedCollectionItem, causando o problema. Em outras palavras, o Assign do TList não chama o Assign de cada TMedCollectionItem. Realmente não estou com os fontes atualizados, mas basicamente o que está faltando é esta implementação: procedure TMedCollection.Assign(Source: TMedCollection); var I: Integer; begin Self.Clear; for I := 0 to Source.Count - 1 do Self.New.Assign(Source.Items[I]); end;
  8. Ao trabalhar com cópias de TMedCollection utilizando o método Assign da forma que está atualmente obtenho uma Violação de Acesso ao liberar minha cópia. Isso acontece porque não existe implementado um método Assign na classe TMedCollection, o que faz com que a cópia utilize a referência de TMedCollectionItem e não uma cópia da instância. Segue anexo código corrigido. pcnNFe.pas
  9. @alex_porthal estou utilizando a versão mais recente do código do ACBr e a consulta está funcionando normalmente.
  10. Ao gravar o registro C500 o campo COD_GRUPO_TENSAO está sendo gravado incorretamente (acrescentando 1). Ex. correto, grupo de tensão gtA1: |C500|0|1|F000001|06|00|150||02|000002568|01012017|01012017|55,00|5,00|50,00|0,00|0,00|0,00|12,00|15,00|10,00|10,00||5,00|5,00|1|01| Ex. incorreto, grupo de tensão gtA1: |C500|0|1|F000001|06|00|150||02|000002568|01012017|01012017|55,00|5,00|50,00|0,00|0,00|0,00|12,00|15,00|10,00|10,00||5,00|5,00|1|02| Aparentemente o problema está na unit ACBrEFDBlocos na função GrupoTensaoToStr. Segue anexo unit corrigida. ACBrEFDBlocos.pas
  11. Algumas units foram salvas utilizando o encoding UTF-8 com os bytes de marcação (BOM) no início do arquivo. Essa codificação impede a compilação com compiladores antigos (Delphi 7), retornando o seguinte erro: ACBrDFe\ACBrXmlDocument.pas(1) Error: Illegal character in input file: 'ï' ($EF) Os arquivos são: ACBrDFe/ACBrNF3e/PCNNF3e/ACBrNF3eXmlReader.pas ACBrDFe/ACBrNF3e/PCNNF3e/ACBrNF3eXmlWriter.pas ACBrDFe/ACBrXmlWriter.pas ACBrDFe/ACBrNFe/DANFE/NFe/LazReport/ACBrNFeDANFeLazReport.pas ACBrDFe/ACBrNFe/PCNNFe/ACBrNFeXmlReader.pas ACBrDFe/ACBrXmlDocument.pas Salvando os arquivos com o encoding latin-1 resolve o problema.
  12. Anexo novo arquivo ini com a nova url do provedor coplan. Coplan.ini
  13. Olá Henrique, o patch já contém estas informações (um diff) do que foi alterado. E se vc colar este arquivo em cima do seu na sua pasta de trabalho com SVN poderá ver as alterações. Em todo o caso, segue anexo as versões antes e depois. pcnConversao - antes.pas pcnConversao - depois.pas
  14. A função estava retornando valor errado devido a ordem das informações estar incorreta. Anexo o patch e também o arquivo com as modificações. pcnConversao.pas correcao.patch
×
×
  • Create New...