Ir para conteúdo
  • Cadastre-se

Dipold

Membros
  • Total de ítens

    20
  • Registro em

  • Última visita

1 Seguidor

Últimos Visitantes

1.251 visualizações

Dipold's Achievements

Apprentice

Apprentice (3/14)

  • First Post
  • Collaborator Rare
  • Conversation Starter
  • Week One Done
  • One Month Later

Recent Badges

9

Reputação

  1. A flag PKCS12_ALLOW_OVERWRITE_KEY, segundo a documentação do wincrypt.h, diz: Ou seja, o arquivo com a chave privada armazenada em cache é sempre sobrescrito para o mesmo PFX. Em meus testes, criando o componente múltiplas vezes em runtime, com a alteração sugerida abaixo, o arquivo com a chave privada é criado no diretório de cache dos certificados, mas apenas uma vez. Essa alteração resolve o problema de quem precisa criar o componente em runtime e importar o PFX a cada ciclo de execução.
  2. diff --git a/ACBR2/Fontes/ACBrSerial/ACBrBALClass.pas b/ACBR2/Fontes/ACBrSerial/ACBrBALClass.pas index 1c472026..cb538b4b 100644 --- a/ACBR2/Fontes/ACBrSerial/ACBrBALClass.pas +++ b/ACBR2/Fontes/ACBrSerial/ACBrBALClass.pas @@ -229,7 +229,7 @@ begin if (fpModeloStr = 'Generica') then begin - AguardarRespostaPeso(MillisecTimeOut, True); + Result := AguardarRespostaPeso(MillisecTimeOut, True); Exit; end; ACBrBALClass.pas
  3. Dipold

    Issue balança genérica

    Ao usar a balança modelo Genérica, a função FACBrBAL.LePeso() sempre retorna -1, pois está faltando o Result na condicional (fpModeloStr = 'Generica'). Código atual: unit ACBrBALClass; function TACBrBALClass.LePeso(MillisecTimeOut: Integer): Double; begin Result := -1; if (fpModeloStr = 'Generica') then begin AguardarRespostaPeso(MillisecTimeOut, True); Exit; end; SolicitarPeso; Sleep(200); LeSerial(MillisecTimeOut); Result := fpUltimoPesoLido; end; Deveria ser: function TACBrBALClass.LePeso(MillisecTimeOut: Integer): Double; begin Result := -1; if (fpModeloStr = 'Generica') then begin Result := AguardarRespostaPeso(MillisecTimeOut, True); Exit; end; SolicitarPeso; Sleep(200); LeSerial(MillisecTimeOut); Result := fpUltimoPesoLido; end; Diante desse bug, a única maneira de ler o peso para balança Genérica, é através do evento OnLePeso();
  4. Acho improvável que vai funcionar dessa forma, pois essa balança requer um envio prévio do comando #05 solicitando o peso. A unit ACBrBALToledo2090.pas faz o mesmo sobreescrevendo o método SolicitarPeso()
  5. 1. Creio que a unit deveria ser adicionada tb em ACBr_Serial.dpk? 2. A Balança AFTS foi implementada 1 ano depois da minha postagem por intermédio de outra publicação de outro usuário: 3. Adicionei no https://github.com/dipold/ACBr/tree/Novas_Balancas o suporte que temos as balanças Toledo IP W9091 WMSI3360 WMSI6260 WOHaus Elas foram implementadas por um antigo funcionário e não passaram por revisão de código interno e utilizam as dll´s fornecidas pelo fabricante. Na string da porta COM passa-se parâmetro no formato: Format('DLL|%s|%s|True', [EnderecoIP, Canal]); //Canal por ser A, B, C ou D Fica por conta e risco de quem quiser baixar, testar ou melhorar.
  6. Você deve ter olhado a branch master que é igual ao repositório svn do ACBr original sem modificações. Na branch Novas_Balancas estão presentes o ACBr original + as alterações das novas balanças: https://github.com/dipold/ACBr/blob/Novas_Balancas/Fontes/ACBrSerial/ACBrBALToledo9091_8530_8540.pas Quanto a comunicação ser USB, vc vai ter que instalar um programa que cria uma porta COM fake que conversa com a USB. Entra em contato com a Toledo, eles mesmo tem um instalador que configura isso. Não sei dar maiores detalhes porque não é uma coisa que mexo no dia a dia.. fiz lá em 2015 e está rodando em 3 clientes sem problemas até então.
  7. Quem não está conseguindo fazer o merge da minha unit postada aqui com os fontes originais do ACBr, fiz um fork do ACBr no meu github onde pretendo mantê-lo atualizado: https://github.com/dipold/ACBr Criei um branch com as modificações necessárias para a balança nele: https://github.com/dipold/ACBr/tree/Novas_Balancas O download do repositório completo com as alterações pode ser feito pelo link: https://github.com/dipold/ACBr/archive/Novas_Balancas.zip Mais a frente vou adicionando nesse repositório outras contribuições que desenvolvemos aqui internamente.
  8. Ficou alguma dúvida com relação ao meu post? Caso não tenha ficado claro, um teste simples pra entender que há perda de dados ao fazer cast para PAnsiChar entre String e AnsiString: program Project1; {$APPTYPE CONSOLE} var AXMLAnsi: AnsiString; AXMLStr: String; begin AXMLAnsi := '<?xml version="1.0" encoding="UTF-8"?>'; AXMLStr := '<?xml version="1.0" encoding="UTF-8"?>'; WriteLn(PAnsiChar(AXMLAnsi)); //Imprime: <?xml version="1.0" encoding="UTF-8"?> WriteLn(PAnsiChar(AXMLStr)); //Imprime: < ReadLn; end.
  9. Dipold

    Regressão ACBrDFeXsXmlSec.pas

    Problema: No método TDFeSSLXmlSignXmlSec.VerificarAssinatura(), a variável AXml foi alterada de AnsiString para String nesse commit, e quando executa a linha: xmlParseDoc(PAnsiChar(AXml)); a conversão para PAnsiChar corrompe seu valor e o método xmlParseDoc() recebe como argumento um valor corrompido/lixo; Solução: Retornar a declaração para AnsiString; Também sugiro alterar o seguinte trecho de código para mensagem ser mais específica do que erro genérico "Erro: Falha ao interpretar o XML "xmlParseDoc"": doc := xmlParseDoc(PAnsiChar(AXml)); if ((doc = nil) or (xmlDocGetRootElement(doc) = nil)) then begin MsgErro := ACBrStr(cErrParseDoc); Exit; end; Para: var schemError: xmlErrorPtr; doc := xmlParseDoc(PAnsiChar(AXml)); if ((doc = nil) or (xmlDocGetRootElement(doc) = nil)) then begin schemError := xmlGetLastError(); if (schemError <> nil) then MsgErro := ACBrStr(cErrParseDoc) + #13#10 + IntToStr(schemError^.code) + ' - ' + schemError^.message else MsgErro := ACBrStr(cErrParseDoc); Exit; end;
  10. Também tive esse problema. Aparentemente certificados mais novos estão vindo com um nível de criptografia não suportado com as configurações: ACBrNFe.Configuracoes.Geral.SSLLib := libWinCrypt; ACBrNFe.SSL.SSLXmlSignLib := xsMsXml; Se alterar SSLXmlSignLib para xsXmlSec funciona. Minha dúvida é se essa combinação (WinCrypt + XmlSec) ainda possui os problemas relatados no post do Bye Bye CAPICOM. Também há possibilidade de você re-exportar esse certificado usando um Windows mais antigo para que o ele salve o certificado com nível de criptografia menor, que o colega acima citou.
  11. Essa flag cheira a POG... sem falar que ela pode impedir que o OnBeforePrint() do relatório seja executado diante de um Refresh() (Two Pass por exemplo). O OnBeforePrint() é chamado em um laço interno no momento de "pintar" cada componente visível do relatório, portanto, usando o "if correto", ele será executado apenas uma vez. A solução muito mais eficiente, portanto, é verificar se o componente do relatório pintado da vez é o que queremos processar: Diff: https://gist.github.com/dipold/1bf92b32c326b415449096c08f8d4c11/revisions?diff=split Arquivo cru modificado: https://gist.githubusercontent.com/dipold/1bf92b32c326b415449096c08f8d4c11/raw/36cf01696da7a04f9c399a149aef4332bab4993e/ACBrNFeDANFEFRDM.pas A propósito, o modelo simplificado não deve estar exibindo a logomarca, pois ele só é visível quando o: [...].Visible := cdsParametros.FieldByName('Imagem').AsString = ''; Em vez de: [...].Visible := cdsParametros.FieldByName('Imagem').AsString <> ''; Como ocorre no modelo 65.
  12. Tenho recebido com frequência esse tipo de dúvida e nem sempre tenho tempo para respondê-las, vou tentar explicar aqui, mas infelizmente, também estou de mãos atadas pois o código da balança ainda não foi aceito pelos moderadores, e como não se usa Github no projeto, não tem como eu disponibilizar um branch funcional para as pessoas baixarem e testarem.. então negócio é tudo manual e no braço! Vamos lá: Considerando que você já fez o download dos fontes atuais e instalou o componente ACBr_Serial.dpk no seu Delphi: 1. Abra e compile o projeto ACBR\Exemplos\ACBrSerial\ACBrBAL\Delphi\BalancaTeste.dpr ; 2. Baixe o arquivo ACBrBALToledo9091_8530_8540.pas e salve-o em ACBR\Fontes\ACBrSerial\ 3. Edite o arquivo ACBrBAL.pas dessa mesma pasta, e inclua balToledo9091_8530_8540 após balAFTS do Enumerator TACBrBALModelo (Linha 60-62); 4. Ainda nesse arquivo, no uses, adicionar a unit ACBrBALToledo9091_8530_8540 após ACBrBALAFTS (Linha 132); 5. Ainda nesse arquivo, no procedimento TACBrBAL.SetModelo(), adicionar no case balToledo9091_8530_8540 : fsBAL := TACBrBALToledo9091_8530_8540.Create(Self); ; 6. Salve o arquivo e tente compilar novamente. Tem que compilar! Senão fez algo errado ; 7. Abra o arquivo BalancaTeste1.pas do projeto do item 1, e substitua o texto da propriedade items do controle cmdBalanca, por este: Nenhuma Filizola Toledo Toledo2180 Urano LucasTec Magna Digitron Magellan UranoPOP Lider Rinnert Muller Saturno AFTS Toledo9091_8530_8540 8. Compile o projeto do item 1, e use o executável gerado por esse projeto para testar a comunicação com a balança. Com ele você já deve ser capaz de ver como "funciona" ; 9. Acredito que o componente TACBrBAL já irá conter a nova balança, mas caso não apareça, você terá que reinstalar o ACBr por completo;
  13. Como assim, "não dá pra fazer o que tu quer ali"? O que havia de errado na minha contribuição? Com relação à crítica ao GIT, e de tudo que andei lendo nesse fórum à respeito, é visível que os que criticam desconhecem profundamente como o GIT funcionaria e quão mais simples e poderoso seria que o SVN + fórum atual. Eu trabalhei anos com VCS e SVN e grande sacada do GIT não é o GIT em si, mas o GITHUB.COM. Para efeitos didáticos, vou relacionar aqui como "seria" o ACBr no github.com: Todo repositório ficaria em um branch chamado master, e apenas Daniel Simões poderia alterá-lo e, opcionalmente, dar o mesmo poder à outros; Nenhuma alteração, nem mesmo Daniel Simões, seria feita diretamente no master, ela é sempre feita em forma de Pull Requests (PR), que é um pacote de alterações com um ou mais commit´s, que é publicado para ser discutido e, quando aprovado pelos interessados, faz-se o mergeamento dele no master; Tudo que cito aqui, fazer PR, Fork, Branch, Commit, etc, são só botões que o usuário clica na interface do github.com ou usando um programa auxiliar como o GitHub For Desktop, não há nada de complicado. A burocracia pode ser resumida em um arquivo "Como Contribuir" em apenas alguns passos: Fazer um fork do projeto ACBr na sua conta do github (que é tipo uma cópia local); Programa as contribuições em um novo branch nessa cópia, dividindo as alterações em pequenos commits; Sobe essas alterações para seu fork, a opção para fazer um Pull Request (PR) irá surgir automaticamente; Faz o PR para o ACBr explicando sua contribuição em um texto. Isso cria um novo branch no repositório original e só o que foi alterado fica visível; Daniel Simões, moderadores e interessados acessam o PR e fazem sugestões de adequação/melhorias, comentando diretamente nas linhas do código, ou solicitando adequação de arquivos relacionados como documentação, exemplos, testes unitários, etc.; O usuário faz novos commits adequando o código às solicitações. Repete-se o ciclo até a contribuição ficar perfeita e irretocável; O PR agora é um pacote de alterações, e está pronto para ser mergeado, pois todos os membros participantes aprovaram as alterações; O Daniel Simões aprova o PR, apenas clicando no botão Aplicar PR, que mergeia o código no master e apaga o branch criado; Para relatar uma dúvida, um bug, uma sugestão: Abre-se uma Issue no projeto, que é tipo um tópico em um fórum; Qualquer um pode respondê-la/comentá-la; Um moderador classifica/etiqueta a Issue como: bug/regressão/dúvida/sugestão/etc. e pode fechá-la ou mantê-la aberta; Caso seja um bug ou sugestão, mantem-se aberta. Qualquer usuário pode então criar um código para atender essa Issue, e ao fazer o PR, ele linka com a Issue relatada; Qualquer um que queria contribuir pode olhar na lista de Issues abertas e contribuir, seja respondendo uma dúvida, ou fazendo um PR com alterações no código. O objetivo da comunidade é ir fechando todas Issues abertas; As vantagens são claras: Não há mais necessidade de manter um fórum, e até mesmo a página pois o GitHub fornecesse tudo isso de graça. Pode-se trabalhar com releases periódicos, e que ficam hospedados nele, sem qualquer ônus; Os moderadores apenas "moderam e supervisionam". Não há mais necessidade deles ficar baixando código dos anexos dos tópicos, olhando, tentando compilá-los, corrigindo e adequando-os manualmente e então subindo para o SVN, pois todo esse trabalho é transferido para os próprios usuários que estão contribuindo; Há sim uma certa "burocracia", mas ela não é à toa, é uma burocracia que trás enormes vantagens à qualidade das contribuições, e pode ser facilmente ensinada em um pequeno tutorial de 15-20 linhas; Cada contribuição fica em evidência na lista de PR´s, não tem como cair no esquecimento. Não depende mais do fator: "moderador ter tempo"; O usuário comum que quer testar aquele PR antes dele entrar no master, pode fazer um fork dele e pronto. Já sai testando. Hoje o usuário tem q baixar as units do anexo do fórum, copiar para as pastas corretas, modificar os dpr´s, tentar compilar, etc, etc. etc.; O código só entra no master quando a comunidade o aprova, o que gera menor possibilidade de bugs; Tudo fica devidamente documentado, pois tem acesso a toda discussão que determinada linha de código passou antes de entrar no repositório, pois um PR pode ser linkado com outros PR e Issues de forma que vc tem todo histórico de vida de cada alteração; Quem contribui, mesmo que não seja moderador, terá seu nome na lista de commit´s. Ser reconhecido cria um incentivo maior para contribuir; O GitHub dá muito mais visibilidade ao projeto, pois é a maior comunidade mundial de desenvolvedores; Vejam como a Caelum, referência na área, lida com seus projetos open-sources como VRaptor por exemplo. Clique nas abas Pull Request e Issues para ver como as contribuições ao projeto ocorrem. Inclusive tem algumas minhas lá. Vejam também quanta contribuição tem nesse projeto e 95% são brasileiros. Porque tratar os programadores Delphi como incapazes de aprender a fazer contribuição no GitHub.com, com relação a programadores de outras linguagens? O GitHub não é apenas um sistema de controle de versão do GIT, ele é uma rede social de desenvolvedores! Enfim, poderia escrever muito mais à respeito, e de forma mais técnica se preciso, mas vou deixar aqui esse resumo como uma crítica construtiva ao projeto.
  14. Eu já havia escrito código para essa balança há 1 ano atrás (embora meu código estava considerando apenas a parte inteira da leitura, sem decimais), juntamente com a balança rodoviária Toledo... Infelizmente minhas contribuições ficaram no esquecimento... Sistema de Controle de Versão por Fórum não tem como funcionar direito...
  15. Desconheço outro emulador (talvez exista). Fiz a codificação comunicando diretamente com a balança no próprio cliente. Você pode alterar o fonte do emulador da ACBr para considerar esse modelo se desejar.
×
×
  • 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.