Ir para conteúdo
  • Cadastre-se

naugustijr

Membros
  • Total de ítens

    7
  • Registro em

  • Última visita

Posts postados por naugustijr

  1. Pessoal,

     

    acabei de encontrar o problema e a solução.

    Juntei os argumentos de cada um de vocês, consegui simular o problema, diagnostica-lo e achar uma solução (que está vinculada ao design da minha aplicação).

     

    Cenário:

    Cliente

      Windows XP

      Impressora fiscal MP 4000 TH FI

      Bobina com pouco papel

      Aplicativo desenvolvido em Visual Basic 6.0 utilizando ACBrFramework

     

    Histórico:

      Aplicativo instalado ontem no cliente.

      Hoje apresentou problemas ao ativar a impressora (ACBR.ATIVAR), retornando a mensagem DISK FULL.

      Ao utilizar o formulario de configuração da impressora (no mesmo aplicativo) a impressora ativava normalmente e retornava a mensagem POUCO PAPEL.

      Eu desativava a impressora e ativava novamente e nada de aparecer a mensagem DISK FULL.

      Saia da configuração da impressora  e quando retornava recebia novamente a mensagem DISK FULL.

     

      Ainda no cliente, pedi para que o mesmo trocasse a bobina (com pouco papel) por uma nova.

      Ele trocou e resolveu o problema.

      O que não tinha sentido (POUCO PAPEL e DISK FULL) confirmou ter alguma relação obscura.

      

      Para encontrar a solução precisava simular o problema no meu ambiente de desenvolvimento.

     

    Simulação em Ambiente de Desenvolvimento:

     

      Sempre uso o emulador da SWEDA, connectsim, e tentei simular pouco papel com ele.

      Em todos os aplicativos que tinha em mãos nao retornava o status e nem a mensagem. 

      Instalei o emulador novo da bematech e tambem nao funcionou direito com o com0com que tenho funcionando aqui.

     

      Instalei emulador antigo da Bematech.

      Este sim me retornou o status de pouco papel e fez com o erro acontecesse em ambiente de desenvolvimento.

     

      Depois de vários testes e tentativas de alteração de código percebi que:

     

      Eu tento no sistema ativar a impressora em 2 locais diferentes:

     

      a) para verificar somente se a impressora esta configurada corretamente e funcionando e 

           Declaracao da variavel global
    
           Public ACBrECF As New ACBrFramework_Net.ACBrECF
    

      B) para trabalhar efetivamente com a impressora.

      Declaração da Variavel Local
    
      Public WithEvents ACBrECF As ACBrFramework_Net.ACBrECF
    

      As diferenças entre os 2 locais de ativação eram a existência(B) ou não (a) de um formulário (form) associado.

      

      Concluí então, que o fato do ACBr disparar eventos como o de POUCO PAPEL exigia um tratamento (ou pelo menos um ambiente-form- em que pudesse se "expressar")

     para o evento disparado.

      

      Para não alterar muito meu código criei um formulário (que fica invisivel o tempo todo) com uma variavel do ACBR que será setada para a instância global e que trata

      os eventos emitidos pelo ACBrECF.

      Formulario
    
    Public WithEvents ACBrECF As ACBrFramework_Net.ACBrECF
    Public WithEvents ACBrAAC As ACBrFramework_Net.ACBrAAC
    Public WithEvents ACBrEAD As ACBrFramework_Net.ACBrEAD
    
    
    Private Sub ACBrECF_OnMsgPoucoPapel()
        MsgBox "POUCO PAPEL", vbCritical, "IMPORTANTE!"
        Beep
    End Sub
     
    
    Chamada ao Formulario
    
    
        Set frm_PDV_Testa_Impressora.ACBrECF = ACBrECF    
            
        Select Case AtivaEProgramaECF 'Onde ocorria o erro
    
    
    

     

      Com esta solução o problema não mais ocorreu.

     

      Resumindo, o cenário de ocorrência foi identificado, uma solução viável foi apresentada. Fica faltando a explicação do porque da mensagem DISK FULL.

     

      É com vocês agora.

  2. Me desculpem. Esqueci de perguntar.

     

    No tópico  a seguinte informação: O próprio componente a extrai numa pasta temporária e a utiliza sem que o usuário saiba.

     

    Como o arquivo ACBrFramework32.dll faz/pode fazer manipulações de arquivos (deve utilizar o path da aplicação ou de onde se encontra) e o mesmo é extraído em uma pasta temporária será 

    que os arquivos que ele tenta ler (exemplo: acbrecfmemo.ini) nunca serão encontrados pois não estão nesta pasta temporária?

     

     

     

    Criamos uma DLL nativa a partir do ACBr, essa ACBrFramework32.dll que você viu.

    Como essa DLL é muito complexa para ser utilizada diretamente, um modelo de objetos semelhante ao ACBr original é criado tanto em C# quando em Java (chamamos isso de wrapper).

     

    A partir desse wrapper você manipula a DLL seja em C# ou em Java da mesma forma que um programador Delphi usa o ACBr, ou seja, você pode usar um exemplo escrito em Delphi ou fazer uma pergunta em qualquer área do fórum que o comportamento e modo de usar será exatamente o mesmo em qualquer linguagem.

     

    Por isso não há razão para usar a DLL nativa ou as classes de interop diretamente. Elas são apenas para fins de desenvolvimento.

    A DLL é embutida no ACBrFramework.Net, de forma que você não precisa copiá-la para nenhum lugar. O próprio componente a extrai numa pasta temporária e a utiliza sem que o usuário saiba.

    Caso queira estudar o fonte, está incluído no SVN do ACBrFramework, é o projeto feito em Lazarus.

     

  3. Pessoal,

     

    como ninguém respondeu e precisava de uma solução,

       recompilei o ACBRFramework32.dll no Lazarus, (com a alteração do parâmetro HTML=1 para HTML=0)

       compilei novamente o ACBrFramework.Net.dll (ACBrFramework.Net.tlb) e usei

       no aplicativo feito em Visual Basic 6.0.

       Funcionou da forma que eu precisava.

     

    O problema é que os dados da empresa que ficam na propriedade MemoParams são genéricos e se quiser uma 

    solução alternativa tenho que gerar um arquivo ACBRFramework32.dll (e descendentes) para cada cliente.

     

    Preciso resolver a questão da atualização (em tempo de execução) do campo MemoParams.

     

    Pensei em algumas alternativas:

     

    1) Gerar um arquivo ACBRFramework32.dll para cada cliente (dito acima)

     

    2) Criar uma propriedade com o local do arquivo ACBrMemoParams.ini (que no ACBrECF.pas é acbrecfmemo.ini, e não consegui ler com este nome tambem)

    e criar um método (procedure) e encapsulá-lo no ACBrFramework para carregar o arquivo;

     

    3) Encapsular a procedure MemoLeParams no ACBrFramework. É possível, viável?

     

    4) Tentar alterar o código fonte do ACBrFramework para que a propriedade MemoParams aceite ser escrita, assumindo que atualmente ela não está funcionando corretamente.

    Documentos associados:

     

    http://blogs.msdn.com/b/aszego/archive/2009/10/12/visual-basic-6-and-net-com-interop.aspx

     
     
    Se alguém puder ajudar, agradeço muito.
     
     

    .  

  4. Pessoal,

     

    não preciso repetir que tanto o projeto ACBr como o ACBrFramework são fantásticos, mas estou encontrando alguns problemas em usá-lo no VB6.

     

    Tenho um aplicativo funcional que utiliza o ACBrX do pessoal do EasyTef. O pessoal sempre me deu um bom suporte mas depois que vocês lançaram o ACBrFramework eles

    não me responderam mais. Acho que perderam o interesse pelo produto. 

    Dessa forma, estou fazendo uma avaliação para trocar o ACBrX pelo ACBrFramework. Ja baixei o projeto, compilei e consigo fazê-lo funcionar PARCIALMENTE.

     

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

     

    Para fazê-lo funcionar tive que fazer algumas alterações no aplicativo de exemplo: 

     

    Trocar:

    Private Sub ACBrECF_OnBobinaAdicionaLinhas(ByVal e As ACBrFramework_Net.BobinaEventArgs)

    Por:

    Private Sub ACBrECF_OnBobinaAdicionaLinhas(ByVal e As ACBrFramework_Net.BobinaAdicionaLinhasEventArgs)

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

     

    Percebi que várias funções que eu usava estão marcadas como PENDENTES:

    Exemplo:

     

    Private Sub mniAchaAliquotaValor_Click()
    'PENDENTE
    'Dim Aliquota As Aliquota
    'Dim Valor As String
    '
    '    Call ACBrECF.LerTotaisAliquota
    
    
    '    Set Aliquota = ACBrECF.AchaICMSAliquota(Valor, "") 'função que usava em minha aplicação
     
    Neste caso específico não preciso mais da função visto que a função de programação de aliquota não cria aliquotas já existentes.
    Mando programar a aliquota e se ela ja existir nada acontecerá.
     
    Não entendi (não encontrei na documentação) porque algumas das propriedades do ACBrECF não existem mais (ou, pelo menos, não funcionam no ACBRFramework).
    Propriedades inexistentes:
      ReTentar
      BloqueiaMouseTeclado 
      ExibeMensagem
      MsgAguarde
      MsgTrabalhando
     
    Objetos Inexistentes:
      ACBrRFD
     
    Metodos Inexistentes:
      ACBrECF.CarregarMemoParams
     
     
     
     
    Algumas das mudanças (incluo em mudanças as pendencias e melhorias em algumas funções) não tiveram grande impacto mas tem uma
    que está me atrapalhando muito (por enquanto, é a única).
     
    No meu aplicativo mostro na tela o retorno do processamento dos comandos em um componente do tipo textbox, utilizando a propriedade
    Linhas do evento ACBrECF_OnBobinaAdicionaLinhas. Para que saida seja satisfatoria o conteudo da propriedade Linhas deve estar em
    modo texto (HTML=0, na propriedade MemoParams) e nao HTML (HTML=1, na propriedade MemoParams). Com o ACBrX eu carregava
    esta informação de um arquivo .INI e atualizava a propriedade MemoParams. Agora não consigo fazer o mesmo com o ACBrFramework
    e o retorno da propriedade Linhas está cheio de tags HTML. Eu preciso realmente resolver este problema. Irei fazer a migração do 
    aplicativo para C# (tenho outros ja rodando) mas não tenho tempo para fazer isso agora.
     
    Tecnicamente falando.
     
    O objeto ACBrECF tem uma propriedade que é um array de string (Propriedade MemoParams) e que não ser alterada mesmo tendo
    o método SET no ACBrFramework.Net.dll. Ela pode ser lida (GET) mas não pode ser alterada. A mensagem que retorna é a seguinte:
     
    Function or interface marked as restricted, or the function uses an Automation Type not supported in Visual Basic.
     
    Acredito que o problema não seja "restricted" visto que a propriedade é publica e outras propriedades da mesma classe são acessadas
    e alteradas normalmente. O problema deve ser o "Automation Type not supported in Visual Basic". 
    Vocês já tentaram alterar a propriedade MemoParams dentro do VB6?

     

    Façam este teste no Aplicativo ECFTeste.vbp. Substituam o inicio do codigo da procedure CarregarACBrECF por

     

    Private Sub CarregarACBrECF()
        Set ACBrECF = New ACBrECF
        
        Dim memoparams As Variant
        
        'Atribuo tranquilamente sem erros
        memoparams = ACBrECF.memoparams
        
        'Altero a variavel local
        memoparams(1) = "LIN000=<center><b>RARARARRARAR</b></center>"
        memoparams(22) = "HTML=0"
        
        'Trecho de codigo que da erro de compilação
        ACBrECF.memoparams = memoparams
        
        
        'Utilizar o AAC
        'Set ACBrAAC = New ACBrAAC
        'ACBrAAC.NomeArquivoAuxiliar = "C:\teste.txt"
        'Set ACBrECF.AAC = ACBrAAC
    
    

     

    Desde já agradeço muito a atenção.

    Ficarei feliz se puder ajudar no projeto também.

     

     

     

     

  5. Estou com problemas ao criar o activex do ACBR para utiliza-lo no visual basic 6.

    O exemplo que tem no projeto esta bastante incompleto e comecei, entao, a ampliá-lo.

    No entanto estou com problemas com relação as funções que passam "estruturas" de dados por parâmetro,

    conforme levantei neste post. http://www.forumweb.com.br/foruns/topic ... ge__st__60 .

    Nao estou consiguindo carregar as aliquotas corretamente.

    Ainda faltam as formas de pagamento e outros.

    Como alternativa a sugestao do post, tentei usar outra funcao:GetAliquotaSStr .

    Ao usar a funcao ECF_GetAliquotaSStr percebi que nao tinha na versão da ACBr32.dll (922KB) da pasta C:\SVN\ACBR\Projetos\ACBr32_DLL\ACBr_ActiveX.

    Usei a outra dll que estava na pasta C:\SVN\ACBR\Projetos\ACBr32_DLL\ACBr32 (1608 kb) mas ai surgiu outro erro

    "BAD DLL calling convention."

    Pesquisei e se refere a questoes de compilacao encontradas no mesmo post.

    http://support.microsoft.com/kb/153586

    http://www.codeguru.com/forum/showthread.php?t=373600

    Check these threads:

    http://www.codeguru.com/forum/showthread.php?t=356338

    http://www.codeguru.com/forum/showthread.php?t=352701

    http://www.codeguru.com/forum/showthread.php?t=371639 __________________

    A sugestao seria recompilar utilizando a diretiva "STDCALL".

    Baixei o Delphi 2010 e tentei recompilar. Nao consegui.

    Ocorreu o seguinte erro:

    [DCC Error] ACBrPAFClass.pas(496): E2010 Incompatible types: 'TListSortCompare' and 'Pointer'

    O que eu faço?

    TFA.

×
×
  • 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.

The popup will be closed in 10 segundos...