Código de barras no modo texto

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Código de barras no modo texto

Mensagem por Pablo César »

Gostaria de saber se é possível definir se a impressora escolhida é matrial.
Matricial quis dizer ? Acredito que este tópico possa te ajudar a buscar uma meia solução: https://pctoledo.org/forum/viewto ... =matricial
gostaria de evitar a pergunta ao usuario quando não for DeskJet ou LaserJet.
Agora para esta questão, você mesmo pode definir, pelo nome da impressora.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Re: Código de barras no modo texto

Mensagem por Jairo Maia »

Olá Pablo,

Show de bola!!! Usei seu exemplo VQTIPO, testei o exemplo abaixo e adaptei ao aplicativo e acho que isto resolve, não creio que terei surpresas. Parece suficientemente seguro da forma que vcs fizeram.

Fiz algumas impressões, e agora só falta ajustar alguns posicionamentos na etiqueta. Valew, Obrigado.

Código: Selecionar todos

#define MATRICIAL  1
#define INC_LASER  2

Function Main()
 Local cPrinter, i, nMaxLen:=0, nCor, nTPrin, nPrn, aPNomes:={}
 Local aPrn:=Win_PrinterList(.t.,.f.)

 If Empty( aPrn )
  Alert("Nenhuma impressora Instalada")
  Return
 Endif

 For i=1 To Len(aPrn)
  AaDd(aPNomes , aPrn[i,1] )
  nMaxLen := If( Len( aPrn[i,1] ) > nMaxLen, Len( aPrn[i,1] ), nMaxLen )
 Next

 Cls
 nPrn := AChoice( 3, 1, Len( aPrn )+1, nMaxLen+1, aPNomes, .T., Nil , aPNomes )
 If nPrn = 0
  Return
 Endi

 cPrinter:=aPNomes[nPrn]
 oPrinter:= Win_Prn():new(cPrinter)
 oPrinter:create()
 oPrinter:startdoc()
 nCor:=oPrinter:numcolors()
 nLar:=oPrinter:pagewidth()
 nAlt:=oPrinter:pageheight()
 oPrinter:enddoc()
 oPrinter:destroy()

 nTPrin:=If( nCor<3 .And. nLar<1000 .And. nAlt<2000, MATRICIAL, INC_LASER )
   
 If nTPrin = 1
  Alert( 'Matricial' )
 Else
  Alert( 'Ink/Laser' )
 Endi

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Re: Código de barras no modo texto

Mensagem por Jairo Maia »

Olá pessoal,

Estou com a seguinte situação:

Código: Selecionar todos

  SetPrc( 0, 0 )
  cBarras:=cTitProd:=CodProd:=''
  oPrinter:SetFont( "Courier New", 7, { 3, -50 } )
  FOR i=1 TO LEN(aTitSup)
   cTitProd+=PADC(aTitSup[i,1],39)  // pega em uma linha titulo para cada etiqueta
  NEXT
  oPrinter:NewLine()
  oPrinter:TextOut(cTitProd)  // imprime titulo do produto
    
  FOR xlin=1 TO (nLin)
   FOR xyz=1 TO LEN(aBarras1)
    cBarras+=aBarras1[xyz]         //pega codbar de cada etiqueta
   NEXT
  NEXT
  
  //While !IsPrinter()  // tentativa de segurar o envio, assim não funciona
   //If LastKey() = K_ESC
    //Break
   //Endif
  //Endd

  MemoWrit('Barras.Tmp',cBarras)
  PrintFileRaw(cPrinter,'Barras.Tmp')  // imprime o codigo de barras

  FOR i=1 TO LEN(abarras)
   IF !EMPTY(abarras[i,1])
    CodProd+=PADC(abarras[i,1],nLen_etq)  // pega o codigo (numero) do produto de cada etiqueta
   ENDI
  NEXT

  oPrinter:NewLine()
  oPrinter:TextOut(CodProd)  // imprime codigo do produto
O código acima responde corretamente, porém, quando imprime tenho um resultado assim:

Código: Selecionar todos

|||||||||||||||||||
Titulo // é ET aqui, tem que ficar em cima
99999999
Quando imprime o titulo usando oPrinter:TextOut(), sai na impressora depois, e não consigo resolver isso. Tentei também somar tudo em uma variavel e gravar, mas não dá certo.

Quando faço isso, o PrintFileRaw, pressiona o titulo sobre a barra, e a barra sobre o código, como se fosse um bloco só. Não há nenhuma pica de espaço entre titulo e codbarra, e codbarra e codigo numerico do produto.

Se acrescento um Chr(13)+Chr(10) no final de cTitProd, abre uma linha cheia, e o mesmo se faço isso em cBarra, abre uma linha cheia abaixo da barra. Sai fora da etiqueta.

Imprimir a linha do codbarra usando oPrinter:TextOut(cBarra), não funciona. Imprime caracteres esdrúxulos, mas não o codigo.

Gravar em arquivo o titulo e imprimir antes do codbarra, acontece o mesmo que disse acima, fica pressionado sobre a barra.

Alguém teria alguma dica, ou poderia me explicar o que esta acontecendo?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Código de barras no modo texto

Mensagem por sygecom »

Na sessão Download coloquei um instalador com alguns exemplos de codigo de barra, de uma olhada lá que talvez ajude.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Re: Código de barras no modo texto

Mensagem por Jairo Maia »

Olá Leonardo,

Obrigado pela sugestão.

Ocorre que este módulo tem algumas particularidades que requereriam muito tempo para repensá-lo. Todo restante da aplicação está converida e funcionando corretamente. Mas esse módulo de impressão de código de barras está um parto.

Tenho que por exigência do cliente que manter a possibilidade de impressão em Matricial, especificamente este trecho que enviei o código.

Com testes realizados com fontes true type, não obtive resultado em matricial, o leitor demora para ler, e muitas vezes falham. A rotina que a aplicação usa imprime perfeitamente em matriciais e ink/lasers.

Por experiência, essa exigência faz sentido neste caso, pois se a etiqueta em jato de tinta umidece, ela com frequência borra, e não é lida.

Impressão em laser ou térmica, falham muito quando úmida, enquanto em matricial não dão problema. Pelo menos é fato isso neste caso.

Qualquer tentativa de negociação de mudança deste recurso está descartada, pois corro o risco de ouvir novamente: "se em DOS funciona, pq em 32 bits não vai funcionar".

Tentei encontrar na internet e neste e outros fóruns situação similar, se há, não encontrei. Talves se eu entendesse pq a função PrintFileRaw() é mais rápida, talves consiga encontrar alguma solução.

Mantendo em Harbour a rotina original, e imprimindo em lpt, funciona redondo, mas tem que usar usb.
_________________________________________________________________________________________________
Editei esta mensagem às 14h37m para inserir outra informação!
Depois que entendi o que ocorria, vi como fui "estúpido" ao dizer:
Tentei encontrar na internet e neste e outros fóruns situação similar, se há, não encontrei. Talves se eu entendesse pq a função PrintFileRaw() é mais rápida, talves consiga encontrar alguma solução.
Pois é! Como diz minha filha: "esqueci de lembrar" de ler, veja:
Method :startDoc() must be called after :create(). It istructs the spooler to begin with a new document and capture subsequent print output. The print output is sent to the printer after the document is closed with method :endDoc().
PrintFileRaw() se lixa pra isso, e imprime o documento imediatamente.

Porém ao usar :EndDoc() após a 1a. linha para iniciar outro para a 2a., a página sofre um eject. Como o que não tem solução está solucionado, titulo do produto e código numérico foi pro fim da etiqueta. Deu certo e foi aceito pelo cliente. Por enquanto vamos em frente.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Código de barras no modo texto

Mensagem por sygecom »

Olá Jairo,
Eu não disse para refazer tudo. Eu dei apenas a dica para pegar o exemplo pronto de lá e usar ai na sua rotina....boa sorte.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Código de barras no modo texto

Mensagem por Jairo Maia »

Olá Leonardo,

Sim, eu entendi. Mas para usar estas dicas, eu teria que mudar minha rotina. Mas acabou ficando resolvido apenas compilando o módulo com Harbou, e por enquanto vai continuar funcionado em LPT, e agora terei tempo para efetuar as mudanças. Alias, assim que resolver algumas coisas que estão pressionando, Vou iniciar os estudos para passar as aplicações para o modo GUI.

Valew as dicas, Obrigado.

Aliás, não sei se não procurei direito, mas aproveitando a oportunidade, você pode me explicar qual a diferença entre "text mode application" e "console application"?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder