Ir para conteúdo
  • Cadastre-se

dev botao

Função LinhaRelatorioGerencial


Reinoldo
Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 2890 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá senhores, 

Recentemente atualizei os fontes do ACBr. Pois estava tendo um travamento com a impressora MP 4200 TH FI II. E segundo o log do SVN 
 Data: 06/04/2016
-- ACBrECFEscECF --
[*] Modificado tamanho máximo de Buffer de envio para Bematech, para 256 bytes
    para evitar travamentos do ECF.   (por: DSA)

Até ai tudo bem, porém ao testar a impressão de comprovante no emulador da impressora MP 4200... a cada envio de texto fica mais alinhado a direita. Imagem "alinhamento a direita.png" no link https://drive.google.com/open?id=0B7ZvS1wjEhJSeWRzNDFjVnllUFU.   Imagem "mudança de código fonte.png" no link https://drive.google.com/open?id=0B7ZvS1wjEhJSX0xqZ3pXdWV4SnM é como deveria imprimir.

Abaixo como está no projeto ACBr a unit ACBrECFEscECF:

procedure TACBrECFEscECF.LinhaRelatorioGerencial(Linha: AnsiString;
   IndiceBMP: Integer);
var
  P, Espera, LenMaxBuffer: Integer;
  Buffer   : AnsiString ;
  EhControle: Boolean;
begin
  Linha := AjustaLinhas( Linha, Colunas, 0, IsBematech );  { Formata as Linhas de acordo com "Coluna" }

  if IsBematech then
    LenMaxBuffer := cEscECFMaxBufferBematech
  else
    LenMaxBuffer := cEscECFMaxBuffer;

  P := pos(LF, Linha);
  while P > 0 do
  begin
    EhControle := Linha[max(P-1,1)] = ESC;

    if not EhControle then
    begin
      Linha := StuffString(Linha, P, 0, CR );  // Adiciona CR antes de LF
      Inc( P );
    end
    else
    begin
      if IsBematech then
      begin
        Delete(Linha, P-1, 1);  // Remove "ESC" (carcater de controle)
        Dec( P );
      end;
    end;

    P := PosEx( LF, Linha, P+1);
  end;

  while Length( Linha ) > 0 do
  begin
     P := Length( Linha ) ;
     if P > LenMaxBuffer then    { Acha o fim de Linha mais próximo do limite máximo }
        P := PosLast(LF, copy(Linha, 1 , LenMaxBuffer) ) ;

     if P = 0 then
        P := Trunc( LenMaxBuffer / Colunas ) * Colunas;

     Buffer := copy( Linha, 1, P);
     Espera := Trunc( CountStr( Buffer, LF ) / 4);

     EscECFComando.CMD := 9;
     EscECFComando.TimeOut := Espera;
     EscECFComando.AddParamString(Buffer);
     EnviaComando;

     { ficou apenas um LF sozinho ? }
     if (P = Colunas) and (RightStr( Buffer, 1) <> LF) and
        (copy( Linha, P+1, 1) = LF) then
        P := P + 1 ;

     Linha  := copy( Linha, P+1, Length(Linha) ) ;   // O Restante
  end ;
end;

 

Abaixo como deixei o código fonte: 

 

procedure TACBrECFEscECF.LinhaRelatorioGerencial(Linha: AnsiString;
   IndiceBMP: Integer);

var
  P, Espera, LenMaxBuffer: Integer;
  Buffer   : AnsiString ;
begin
  Linha := AjustaLinhas( Linha, Colunas, 0, (IsEpson or IsBematech) );  { Formata as Linhas de acordo com "Coluna" }

  if IsBematech then
    LenMaxBuffer := cEscECFMaxBufferBematech
  else
    LenMaxBuffer := cEscECFMaxBuffer;

  while Length( Linha ) > 0 do
  begin
     P := Length( Linha ) ;
     if P > LenMaxBuffer then    { Acha o fim de Linha mais próximo do limite máximo }
        P := PosLast(LF, copy(Linha, 1 , LenMaxBuffer) ) ;

     if P = 0 then
        P := Trunc( LenMaxBuffer / Colunas ) * Colunas;

     Buffer := copy( Linha, 1, P)  ;
     Espera := Trunc( CountStr( Buffer, LF ) / 4) ;

     EscECFComando.CMD := 9                                ;
     EscECFComando.TimeOut := Espera ;
     EscECFComando.AddParamString(Buffer);
     EnviaComando;

     { ficou apenas um LF sozinho ? }
     if (P = Colunas) and (RightStr( Buffer, 1) <> LF) and
        (copy( Linha, P+1, 1) = LF) then
        P := P + 1 ;

     Linha  := copy( Linha, P+1, Length(Linha) ) ;   // O Restante
  end ;

end;

 

Não sei se estou fazendo errado, ou se precisa de algum parâmetro que não estou passando. Mas com minha alteração a impressão fica certa.

Obs: vi que a mudança dessa função entrou no seguinte commit 

Revision: 10712
Author: dopi
Date: segunda-feira, 21 de dezembro de 2015 14:53:13
Message:
-- ACBrECFEscECF --
[*] Ajuste para correta impressão de Cod.Barras e Caracteres de Controle em
    Epson TM-800/900F, e Bametech MP4200-THFI
    (nota: Para a Impressão de Cod.barras usando a DLL da Epson como túnel, é
     requer necessário uma atualização da mesma)
    (por: DSA)

----
Modified : /trunk2/Fontes/ACBrSerial/ACBrECFBematech.pas
Modified : /trunk2/Fontes/ACBrSerial/ACBrECFEpson.pas
Modified : /trunk2/Fontes/ACBrSerial/ACBrECFEscECF.pas
Modified : /trunk2/Fontes/ACBrSerial/ACBrSerial-change-log.txt

Link para o comentário
Compartilhar em outros sites

  • Fundadores

As suas modificações irão quebrar o suporte a impressão de cod.barras....

Lembro que não notei o problema quando fiz as ultimas modificações... como posso reproduzi-lo no ECFTeste ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

No ECFTeste vá no menu Relatórios, no subItem Relatório Gerencial e qualquer uma das opções ali, ficará tudo na mesma linha.
Mas no meu caso. Utilize as seguintes opções: 
Menu -> Relatórios

SubItem -> Relatório Gerencial -> abre Relatório gerencial (qualquer indice)

SubItem -> Relatório Gerencial -> imprime linha relatório (escreve qualquer coisa)
Menu -> Relatórios -> Pula linhas (7)
SubItem -> Relatório Gerencial -> imprime linha relatório (escreve qualquer coisa)
 

nesse momento verás que a cada pula linha e cada imprime linha escreverá mais a direita.

relatorio gerencial.png

Link para o comentário
Compartilhar em outros sites

  • Fundadores
  • Solution

Isso é um Bug do Emulador... ele não consegue "compreender" os comandos de quebra de linha...mas não ocorrerá no ECF real...

Mas notei que esse ECF suporta 49 caracteres, e a classe configura o numero de colunas para 48.

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Não havia reparado que a imagem inicial era do emulador...

Lembro que quando iniciei o desenvolvimento da Unit ACBrECFEscEcf.pas, perdi algumas horas até descobrir que se tratava de um bug do emulador ;)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2890 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.