Páginas usando o WIN32prn()

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

Moderador: Moderadores

rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Páginas usando o WIN32prn()

Mensagem por rbonotto »

Ola pessoal,

Estou com um problema com a impressão de um relatório usando a win32prn().

Pelo programa formo um arquivo .TXT e em seguida mando para a imprimir via win32prn(), o problema é que
muitas vezes este arquivo passa de 60,70 ate umas 200 linhas e a função só imprime a primeira pagina. O arquivo txt
esta correto mas só uma parte vai para impressora.

Segue o código:

Código: Selecionar todos

cFileName   := vArCom1
cLinha      := Nil
aLinesPrint := {}
cBuffer     := FOpen( cFileName, 2 )
WHILE Hb_FReadLine( cBuffer, @cLinha, Nil, 255 ) = 0
   AADD( aLinesPrint, cLinha )
END
nPrn := ACHOICE( 03, 02, maxRow()-10, maxCol()-30, aPrn, .T., , nPrn )
IF ! EMPTY( nPrn )
   prnprtc( aPrn[nPrn] )
ELSE
   RETURN
ENDIF


***************************************************
FUNCTION prnprtc(cPrinter)
***************************************************
LOCAL oPrinter     := WIN32PRN():New(cPrinter), aFonts, nPos
oPrinter:Landscape := .F.
oPrinter:FormType  := DMPAPER_A5_TRANSVERSE
oPrinter:Copies    := nUmDEvEz

IF !oPrinter:Create()
   avs('ERRO CAMINHO DA IMPRESSORA')
ELSE
   IF !oPrinter:startDoc('')
      avs('ERRO INICIANDO DOCUMENTO.')
   ELSE
      oPrinter:UnderLine( .F. )
      oPrinter:SetFont( mAinFonte,mAinTaman,{1,20}, 0, .F., .F. )
      For i = 1 To Len ( aLinesPrint )
         oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
         oPrinter:newLine()  // passa para proxima linha
      Next
      oPrinter:EndDoc()
      oPrinter:Destroy()
   END
END
RETURN(NIL)
Este é o conteudo do arquivo .txt:

VALOR EM ABERTO: 4,217.99 em 61 CONTA(S)
------------------------------------------------------------------------------------------------------------------------

14/12/2007 0000015443 12.00 -
16/01/2008 0000016667 9.50 -
23/01/2008 0000017141 30.00 -
23/01/2008 0000017142 13.00 -
23/01/2008 0000017143 7.00 -
25/01/2008 0000017336 7.00 -
06/02/2008 0000017847 19.80 -
28/09/2015 0000019535 10.00 -
28/09/2015 0000019536 79.98 -
28/09/2015 0000019537 90.00 -
28/09/2015 0000019538 800.00 -
28/09/2015 0000019539 300.00 -
28/09/2015 0000019540 439.89 -
28/09/2015 0000019541 13.33 -
28/09/2015 0000019542 650.00 -
28/09/2015 0000019543 666.50 -
28/09/2015 0000019544 250.00 -
28/09/2015 0000019545 220.00 -
28/09/2015 0000019546 10.00 -
28/09/2015 0000019547 10.00 -
28/09/2015 0000019548 30.00 -
28/09/2015 0000019549 10.00 -
28/09/2015 0000019550 10.00 -
28/09/2015 0000019551 10.00 -
28/09/2015 0000019552 10.00 -
28/09/2015 0000019553 10.00 -
28/09/2015 0000019554 10.00 -
28/09/2015 0000019555 10.00 -
28/09/2015 0000019556 10.00 -
28/09/2015 0000019557 10.00 -
28/09/2015 0000019558 10.00 -
28/09/2015 0000019559 10.00 -
28/09/2015 0000019560 10.00 -
28/09/2015 0000019561 20.00 -
28/09/2015 0000019562 10.00 -
28/09/2015 0000019563 10.00 -
28/09/2015 0000019564 30.00 -
28/09/2015 0000019565 10.00 -
28/09/2015 0000019566 10.00 -
28/09/2015 0000019567 30.00 -
28/09/2015 0000019568 10.00 -
28/09/2015 0000019569 10.00 -
28/09/2015 0000019570 70.00 -
28/09/2015 0000019571 20.00 -
28/09/2015 0000019572 20.00 -
28/09/2015 0000019573 10.00 -
28/09/2015 0000019574 10.00 -
28/09/2015 0000019575 10.00 -
28/09/2015 0000019576 13.33 -
28/09/2015 0000019577 10.00 -
28/09/2015 0000019578 10.00 -
28/09/2015 0000019579 10.00 -
28/09/2015 0000019580 10.00 -
28/09/2015 0000019581 10.00 -
28/09/2015 0000019582 10.00 -
28/09/2015 0000019584 10.00 -
28/09/2015 0000019585 10.00 -
28/09/2015 0000019586 10.00 -
28/09/2015 0000019587 10.00 -
28/09/2015 0000019588 10.00 -
28/09/2015 0000019589 26.66 -
------------------------------------------------------------------------------------------------------------------------

VALOR EM ABERTO: 4,217.99 em 61 CONTA(S)
------------------------------------------------------------------------------------------------------------------------

O PDF fica assim:

[Imagem
mixsistemas@gmail.com
lucimauro
Usuário Nível 3
Usuário Nível 3
Mensagens: 465
Registrado em: 21 Set 2004 21:02
Localização: Sobral-CE

Páginas usando o WIN32prn()

Mensagem por lucimauro »

Voce tem que detectar o eject para saltar a folha.
Veja o exemplo :

cTexto:=memoread(cArq)
nLinhas:=mlcount(cTexto, 80, 1, .F.)
for nA:=1 to nLinhas
cLinha:=memoline(cTexto, tamrel, nA, 1, .F.)
if left(alltrim(cLinha),1)==chr(12) && Eject
oPrinter:NewPage()
else
oPrinter:TextOut(" " + cLinha,.T.)
endif
next
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Páginas usando o WIN32prn()

Mensagem por rbonotto »

Obrigado lucimauro, mas em que parte do meu código coloco estas linhas ?
mixsistemas@gmail.com
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Páginas usando o WIN32prn()

Mensagem por rbonotto »

Opas ! ja coloquei no código :D

Ficou assim:

Código: Selecionar todos

LOCAL oPrinter     := WIN32PRN():New(cPrinter), aFonts, nPos
oPrinter:Landscape := .F.
oPrinter:FormType  := DMPAPER_A5_TRANSVERSE
oPrinter:Copies    := nUmDEvEz

IF !oPrinter:Create()
   Alert('ERRO CAMINHO DA IMPRESSORA')
ELSE
   IF !oPrinter:startDoc('')
      Alert('ERRO INICIANDO DOCUMENTO.')
   ELSE
      oPrinter:UnderLine( .F. )
      oPrinter:SetFont( mAinFonte,mAinTaman,{1,20}, 0, .F., .F. )
      mEconTar := 1
      FOR i = 1 To Len ( aLinesPrint )
         oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
         oPrinter:newLine()  // passa para proxima linha
         mEconTar ++
         IF mEconTar > lImiteLin
            oPrinter:NewPage()
            mEconTar := 1
         END
      NEXT
      oPrinter:EndDoc()
      oPrinter:Destroy()
   END
END
RETURN(NIL)

Pelo que vi o win32prn() não obedece os comandos EJECT deixados internos do arquivo de texto, a formatação fica
bem complicada quando tem-se páginas com número de linhas diferentes entre elas.
mixsistemas@gmail.com
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Páginas usando o WIN32prn()

Mensagem por Itamar M. Lins Jr. »

Ola!
Se a impressora for matricial e/ou imprimir em DRAFT use PrintFileRaw().
No caso a folha(tamanho do papel) está para A5!
Os eject's e os CHR()'s da vida só funcionam se usar printfileraw().

Atenção! win32prn(xHarbour) ou simplesmente Win_Prn(Harbour). Até a M$ mudou os comandos para win_api tirou esse 32...

Eu uso esses códigos para setar corretamente o tamanho da página(bobina)

Código: Selecionar todos

cText := memoread(cArq)
nLinh := mlcount(cText)
nTL   := (nLinh/5)
oPrn  := win_prn():New(cPrint)
oPrn :LandScape   := .F.
oPrn :FormType    := WIN_DMPAPER_USER
oPrn :PaperLength := 8.5*25.4*nTL
oPrn :PaperWidth  := 3*25.4*10
oPrn :Copies      := 1
Obs. Usando papel bobina, e Harbour.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
rbonotto
Usuário Nível 3
Usuário Nível 3
Mensagens: 253
Registrado em: 06 Mai 2005 18:52

Páginas usando o WIN32prn()

Mensagem por rbonotto »

Valeu Itamar M. Lins Jr.

Mas os santos dos clientes colocoram um impressora Brother para páginas a4 e o printfileraw() não funciona.

Mas deu para quebrar um galho com oPrinter:NewPage()

Abraços !
mixsistemas@gmail.com
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Páginas usando o WIN32prn()

Mensagem por Laudelino Scarmagnani »

Olá, boa noite!
Usando Win32PRN, preciso definir tamanho do formulário para imprimir preço em etiqueta de gôndolas de supermercado. Etiquetas amarelas, 3,1 cm.
Não sei onde encontrar isso.
Laudelino
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Páginas usando o WIN32prn()

Mensagem por Jairo Maia »

Olá Laudelino,

E qual a impressora que vai imprimir? Se for a Argox posso ajudar.
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)
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Páginas usando o WIN32prn()

Mensagem por Laudelino Scarmagnani »

Boa tarde, Jairo.
Impressora OS-214plus Argox.
Laudelino
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Páginas usando o WIN32prn()

Mensagem por Jairo Maia »

Olá Laudelino,

Em se tratando de impressora Argox, você não usa WIN32PRN. Usamos os recursos da própria impressora. Adaptei um exemplo com base na função que uso, mas não tenho como testar a impressão, apenas gerou corretamente o arquivco a ser enviado para a impressora.

Faça um teste de impressão, e verifique o layout, e tente fazer as mudanças necessárias as suas necessidades.

Anexei também o manual em linguagem PPLA.

Código: Selecionar todos

/*
  Compilar usando: Hbmk2 exemplo.prg -lhbwin
*/
Function Main()

 cProduto := "NESCAU 2.0 LATA 400 G"
 cUnitario := "UN" // UN, KG, LT, FD, CX, etc...
 nPreco := 4.80
 cCodigo := "7891000053508"  // GTIN valido ou nao sera impresso

 EtqGondola( cProduto, cUnitario, nPreco, cCodigo )
 
Return Nil

Function EtqGondola( cProduto, cUnitario, nPreco, cCodigo )
 Local cCtr := chr(2), cEol := Hb_Eol(), cDescProd
 Local cPrinter, cFileImp:="Gondola.Txt"

 SET DEVI TO PRIN
 SET PRIN TO ( cFileImp )

 @ Prow()+0, PCol() Say cCtr + "e" + cEol     // habilita o sensor gap
 @ Prow()+0, PCol() Say cCtr + "m" + cEol     // unidade em milimitro
 @ Prow()+0, PCol() Say cCtr + "M0300" + cEol // fixa o comprimento em 30mm
 @ Prow()+0, PCol() Say cCtr + "L" + cEol     // entra em modo formato etiqueta
 @ Prow()+0, PCol() Say "H20"      + cEol     // fixa temperatura vai de: H10 a H20 recomendavel H16
 @ Prow()+0, PCol() Say "D11"      + cEol     // Padrao para pixels

 cDescProd:=AllTrim( cProduto )

 If Len( cDescProd ) > 23
  @ Prow()+0, PCol() Say "190000401900010" + cDescProd + cEol  // titulo em fonte pequena
 Else
  @ Prow()+0, PCol() Say "190000601800050" + cDescProd + cEol  // titulo em fonte grande
 EndIf

 @ Prow()+0, PCol() Say "190000500500900" + cUnitario + cEol  // UN ou KG
 @ Prow()+0, PCol() Say "160000700500500" + Tran( nPreco, "@E 9,999.99" ) + cEol  // preço de venda
 @ Prow()+0, PCol() Say "1F0008000300050" + Left( cCodigo,12) + cEol  // codigo de barras (sem digito verificador)

 @ Prow()+0, PCol() Say "E"      + cEol  // envia para a impressora
 @ Prow()+0, PCol() Say "Q" + cEol       // esvazia a memória da impressora

 SET PRIN TO
 SET DEVI TO SCREEN

 cPrinter := GetDefaultPrinter()  // pega impressora padrao
 PrintFileRaw( cPrinter, cFileImp, "Etiqueta de Gondola" )

Return 
Anexos
Argox PPLA - Programação.pdf
(169.46 KiB) Baixado 278 vezes
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)
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Páginas usando o WIN32prn()

Mensagem por Laudelino Scarmagnani »

Jairo, bom dia!
Tentei fazer uns testes de impressão da etiqueta e não imprimiu. A impressora roda as etiquetas e não imprime. Não tenho experiência nisso. Estou usando o xHabour, mas acredito que o processo seja igual ao Clipper.
Uso os comando da seguinte forma:
WNOMER=espro->nomercad
oPrinter:SetFont('Courier New',nAltu,{1,21}, 0, .F., .F.)
oPrinter:SetPrc(oprinter:Prow()+1,1)
oPrinter:Textout(WFRAME)
SELECT PRE
WFRAME = TRANSFORM(VLPRECO1, '@E 999,999,999.99')
oPrinter:SetPrc(oprinter:Prow()+2,5)
oPrinter:SetFont('Courier New',15,{1,10}, 0, .F., .F.)
oPrinter:Textout(WFRAME)
oPrinter:SetFont('Courier New',nAltu,{1,21}, 0, .F., .F.)
if !empty(espro->cdcodean)
oPrinter:SetPrc(oPrinter:Prow()+1, 5 )
oPrinter:TextOut(ALLTRIM(espro->cdcodean))
endif
WFRAME='.'
oPrinter:SetPrc(oprinter:Prow()+3,1)
oPrinter:Textout(WFRAME)

Tens como me orientar neste tipo de impressão?
Laudelino
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Páginas usando o WIN32prn()

Mensagem por Jairo Maia »

Laudelino, como as mengaens foram quase simultâneas, preciso perguntar se você viu meu exemplo no post anterior a este seu último.

Da forma que você está fazendo, não vai funcionar. Precisa enviar toda configuração via um arquivo .txt como mostra meu exemplo acima.
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)
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Páginas usando o WIN32prn()

Mensagem por Laudelino Scarmagnani »

Ok, Jairo. Recebi o exemplo e o Manual. Vou estudá-los.
Ví que mais complicado do que pensava.
Programo com xHarbour e vou verificar como fazer isso. Não domino muito a linguagem.
Obrigado pela ajuda.

Somente para clarear um pouco.
Pelo que vi, por cima, no manual do impressora, aceita os comando DOS. Pelo que você falou e verifiquei no exemplo, enviando um arquivo.
Então, gero a impressão normal como qualquer outro relatório, gerando os caracteres de controles específicos. Ao final, envio o arquivo à impressora?
Desculpe as perguntas meio bobas, mas, não domino muito a "micro_informática". Meu dia a dia é Cobol em Maiframe.
Abraços
Laudelino
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Páginas usando o WIN32prn()

Mensagem por Jairo Maia »

Olá Laudelino,
Laudelino Scarmagnani escreveu:Então, gero a impressão normal como qualquer outro relatório, gerando os caracteres de controles específicos. Ao final, envio o arquivo à impressora?
Isso mesmo. No caso do exemplo acima será gerado esse arquivo texto que é enviado a impressora:
Gondola.Txt
(147 Bytes) Baixado 472 vezes
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)
Laudelino Scarmagnani
Usuário Nível 3
Usuário Nível 3
Mensagens: 303
Registrado em: 07 Fev 2007 10:54

Páginas usando o WIN32prn()

Mensagem por Laudelino Scarmagnani »

Jairo,
estou implementando o exemplo, mas tenho problemas aqui.
Ao compilar, usando HbMake v1.20 - sHarbour Make Utility, xHarbour build 1.0.0 Intel. (Simplex) / Borland C++ 5.5.1 e
deu o seguinte erro:
Error:Unresolved external '_HB_FUN_LIB_HB_EOL' referenced from C:\SISTEMA\XHB\OBJ\PRECOS.OBJ
Está faltando algo aí, e não sei o que pode ser. Ou tenho que definir algo no .prg?
Laudelino
Responder