Linhas se recortada quando Printer.Print a uma “genérica só texto” printer

StackOverflow https://stackoverflow.com/questions/402062

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou manutenção de um aplicativo VB6 antigo que impressão ZPL-II.

Eu só descobrir que ele tem um bug se eu imprimir longas filas para a impressora por " Printer.Print ", as linhas serão aparadas para primeiro 89 bytes / única linha. Ele funciona perfeito e manter as linhas, pois é quando eu uso Imprimir ou Copiar em DOS para LPT.

Onde é que esse comportamento vem? Como posso corrigi-lo ou solução? Eu gostaria de apoiar todas as impressoras, incluindo LPT, USB e impressora de rede.

PS. Eu verifique os bytes reais enviados para a impressora por impressão para um arquivo, não LPT.

Foi útil?

Solução 2

Eu era um trabalho ao redor para não usar Printer.Print. Mas usar FileSystemObject para imprimir arquivo de texto para um caminho UNC de uma impressora de rede.

Ele funciona como um creme, mas a impressora tem de ser mapeada. Mesmo uma impressora local.

Outras dicas

Você precisa usar a função Printer.TextWidth e compará-lo à propriedade Printer.ScaleWidth, a fim de lidar com esse problema no Visual Basic 6. Ele não faz quebra de linha automática para você como a função DOS.

Você vai se certificar de que a fonte que a impressora está muito corretamente coincidir com a fonte da impressora. Isso pode exigir a usar uma das fontes "impressora" o motorista vem com. Caso contrário, tente usar Courier New, que é uma fonte de espaço fixo. Caso contrário, o valor de largura do texto não vai informar corretamente a largura.

Uma alternativa é usar a função string Len para contar o número de caracteres e lidar com a truncagem mesmo se exceder 89 caracteres.,

Algo como como

  Do Until LineToPrint = ""
    TempD = Len(LineToPrint)
    If TempD > 89 Then
      Print Mid$(LineToPrint,1, 89)
      LineToPrint = Right$(LineToPrint,TempD-89)
    Else
      Print LineToPrint
      LineToPrint = ""
    End If
  Loop   

Se você gosta Funções Recursivas você poderia escrevê-lo como este

Private Sub PrintLine(ByVal LineToPrint As String, ByVal Width As Integer)
    TempD = Len(LineToPrint)
    If TempD > Width Then
      Printer.Print Mid$(LineToPrint, 1, Width)
      LineToPrint = Right$(LineToPrint, TempD - Width)
      PrintLine LineToPrint, Width
    Else
      Printer.Print LineToPrint
    End If
End Sub
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top