Página 1 de 2

win_prn, ajuda com código

Enviado: 23 Out 2014 16:29
por rbonotto
Boa pessoal !

Peguei este código do Jairo daqui do forum e fiz só umas pequenas alterações.
O arquivo X2121.TXT é um arquivo de texto com umas dez linhas, com 160 colunas.
Estou usando Harbour 3.1

Compila, roda, não da erro mas não manda para a impressora.
No exemplo tinha que adicionar #include "WinGdi.ch"
Mas não achei nas pastas do Harbour.

Estava imprimindo com o win_printfileraw() mas ele não obedece o comando chr(27) + chr(15) para compactar as letras, ai resolvi testar
a win_prn()

Alguém poderia dar uma dica ?

Tirei do codigo os alerts de impressora não achada, etc pois testei com estes comando e não davam erro. Tirei só para o codigo ficar menor
aqui no forum.

Código: Selecionar todos

#include 'inkey.ch'
#include "set.ch"
#include 'dbedit.ch'
#include 'hbgtinfo.ch'
#include 'HbWin.ch'


**************************
Function Main()
**************************

 Local cPrinter
 Local contl := 1
 cFileName := "X2121.TXT"
 
cLinha      := Nil
aLinesPrint := {}
cBuffer     := FOpen( cFileName, 2 )

While Hb_FReadLine( cBuffer, @cLinha, Nil, 255 ) = 0
   AaDd( aLinesPrint, cLinha )
End
FClose( cBuffer )

cPrinter := PegaPrinter()  // escolhe a impressora

nCopias := 1  // n£mero de c¢pias

*oPrinter           := Win32Prn():new( cPrinter )
oPrinter           := Win_Prn():new( cPrinter )
oPrinter:landscape := .F.
*oPrinter:formType  := DMPAPER_A4  // folha A4 - se deixar aberto da erro 
oPrinter:copies    := nCopias

****************************************************
*   impressao comprimida: { 3, -50 } ‚ igual 50/3, ou seja 16.6 cpp
*   oPrinter:SetFont( "Lucida Console", 10, { 3, -50 } )
*
*   impressao normal
****************************************************

oPrinter:SetFont( "Lucida Console", 10 )
oPrinter:CharSet( 0 )

*oPrinter:bold( FW_NORMAL )  // nao negrito, nao it lico, etc...- se deixar aberto da erro  

For i = 1 To Len ( aLinesPrint )
   oPrinter:textOut( aLinesPrint[ i ] )  // imprime a linha
   oPrinter:newLine()  // passa para proxima linha
Next


oPrinter:endDoc()   // envia a impressora
oPrinter:destroy()  // fecha documento de impressao

Return Nil


*********************************************
Function PegaPrinter()  // seleciona impressora
*********************************************
 Local i, nPrn := 1, oPrn, nMaxLen := 0, aPNomes := {}
 Local cPrinter := "", aPrn := GetPrinters( .t. )
 Local cPrinDefault := GetDefaultPrinter()

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

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

 Clear Screen
 nPrn := AChoice( 3, 10, Len( aPNomes )+3, nMaxLen+10, aPNomes, .T., Nil , nPrn )
 If nPrn = 0
  Return ( cPrinter )
 Endi

 cPrinter := Alltrim( aPNomes[nPrn] )

Return ( cPrinter )

win_prn, ajuda com código

Enviado: 23 Out 2014 17:18
por Kapiaba
Olá, veja se não é isto que falta:

https://github.com/vszakats/harbour-cor ... in32prn.ch

abs

win_prn, ajuda com código

Enviado: 23 Out 2014 17:20
por Kapiaba

win_prn, ajuda com código

Enviado: 23 Out 2014 18:23
por rbonotto
Coloquei o conteudo do link em um arquivo e salvei como win32prn.ch, coloquei na pasta include, adiocionei no PRG, mas
não modificou em nada.

Estou usando o Harbour, será que esta função não roda somente no xharbour ?

win_prn, ajuda com código

Enviado: 23 Out 2014 19:51
por rbonotto
Fiz umas alterações e agora esta funcionando:

Código: Selecionar todos

#define DMPAPER_A5                  11    && A5 148X210mm
#define DMPAPER_A5_TRANSVERSE       61    && A5 Transverse 148 x 210 mm
*
*
*
*------------------------------------------------------------------------------
FUNCTION Main()
*
LOCAL nPrn:=1
LOCAL aPrn:= GetPrinters()
Clear
IF EMPTY( aPrn )
   Alert( 'Nenhuma impressora encontrada' )
   QUIT
END
WHILE ! EMPTY( nPrn )
   @ 00,00 CLEAR TO 25,80
   cFileName := "X2121.TXT"
   IF !FILE(cFileName)
      CLEAR
      @01,01 SAY 'ARQUIVO NAO ENCONTRADO...'
      QUIT
   END
   cLinha      := Nil
   aLinesPrint := {}
   cBuffer     := FOpen( cFileName, 2 )
   While Hb_FReadLine( cBuffer, @cLinha, Nil, 255 ) = 0
      AaDd( aLinesPrint, cLinha )
   End
*  FClose( cBuffer )

   @ 01,00 TO maxRow(),maxCol()
   nPrn := ACHOICE( 02, 01, maxRow()-1, maxCol()-1, aPrn, .T., , nPrn )
   IF ! EMPTY( nPrn )
      printerfile( aPrn[nPrn] )
   ELSE

   ENDIF
ENDDO
RETURN( NIL )

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

IF ! oPrinter:Create()
   Alert('Erro criando a impressora')
ELSE
   IF !oPrinter:startDoc('')
      Alert('Erro iniciando documento.')
   ELSE
      oPrinter:UnderLine( .F. )
      oPrinter:SetFont( 'Courier New',10,{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()
   ENDIF
ENDIF
RETURN(NIL)
Muito obrigado pelas dicas ! Ganhei meu dia !

Abraços

win_prn, ajuda com código

Enviado: 24 Out 2014 00:53
por Jairo Maia
Bom que resolveu. Legal...
rbonotto escreveu:No exemplo tinha que adicionar #include "WinGdi.ch"
Mas não achei nas pastas do Harbour.
É que você pegou algum exemplo postado para xHarbour. O arquivo WinGdi.ch é do xHarbour.

Porém, se você está usando Harbour, pode trocar a classe Win32Prn() por Win_Prn(), já que foi alterado assim para o Harbour.

win_prn, ajuda com código

Enviado: 24 Out 2014 16:00
por rbonotto
Aproveitando mais um pouco:

nesta linha:

oPrinter:SetFont( 'Courier New',10,{1,20}, 0, .F., .F. )

Após o 'Courier New', imagino que o primeiro 10 é o tamanho da fonte, e o {1,20} o 0 e os dois .f. o que seriam ?

win_prn, ajuda com código

Enviado: 25 Out 2014 09:12
por Jairo Maia
Olá rbonoto,

Código: Selecionar todos

setFont( <NameFonte>, [<Tamanho>],[<cpp>],[<Formato>],[<Sublinhado>],[<Italico>],[<CharSet>])
Duas observações:

cpp (Caractere Por Polegada): Se você colocar entre os colchetes o valor { 3, 60 }, será o mesmo que colocar 20 sem os colchetes, que equivale: 60/3

Formato: 0 é padrão. mas pode também ser usado de 100 a 900 :
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_HEAVY 900

Mesmo em Harbour tendo sido mudado para Win_Prn(), procure no xHarbour Language Reference Guide por Win32Prn. São fantásticos os recursos que esta classe oferece.

win_prn, ajuda com código

Enviado: 25 Out 2014 19:50
por rbonotto
Valeu Jairo !

Vou estudar !

Abraços

win_prn, ajuda com código

Enviado: 26 Out 2014 17:13
por sygecom
Olá RBonotto,
Veja abaixo o exmplo do Hasse,explica cada parâmetro e exemplos de uso muito bom e tudo em um fonte só.
viewtopic.php?f=4&t=6465&hilit=win32prn

win_prn, ajuda com código

Enviado: 30 Out 2014 10:00
por rbonotto
Obrigado Sygecom !

Abraços,

win_prn, ajuda com código

Enviado: 03 Nov 2014 14:36
por leandrolinauer
Boa tarde a todos.
Estou com um problema com o uso da win_prn em harbour, tem horas que imprime normal na laser e tem horas que não imprime de jeito algum, mas se eu enviar para pdf (dopdf) e depois para a impressora laser, sai normal, mas porque não consigo enviar direto para a laser, utilizo a classe win32prn.

Grato

win_prn, ajuda com código

Enviado: 03 Nov 2014 19:11
por Jairo Maia
Olá Leandro,

Na minha opinião pode ser que dependendo da situação você não está finalizando o envio da impressão. Mas para que possamos saber onde está o problema, você precisa mostrar o código da função que você está usando, mais especificamente, a função que "as vezes imprime e as vezes não imprime".

win_prn, ajuda com código

Enviado: 06 Nov 2014 17:56
por leandrolinauer
Boa tarde, segue abaixo a função que trata o arquivo de impressão generico, não da pra saber direito aonde foge, mas o arquivo é criado só não vai para a impressora, e tem horas que vai principalmente se reiniciar o dono da impressora.

Código: Selecionar todos


Function ImpWIN32PRN(cArq,tamrel,aPo,aTl,aNf,aIA,aIL) // arquivo e tamanho da linha
Local cTexto, nLinhas, nA, cLinha, oPrinter


oPrinter:=Win_prn() //CHAMA A WIN_PRN


oPrinter:New(cPrinter) //pega a escolhida
oPrinter:Landscape:=If(aPo=="H",.T.,.F.)  //VERTICAL=.F.  // HORIZONTAL=.T.
oPrinter:FormType :=1
oPrinter:Copies   :=1
oPrinter:CharSet(255)
oPrinter:SetPrintQuality(1) //qualidade da impressãoo 1 rascunho 2 normal 3 media 4melhor

If oPrinter:Create()

   oPrinter:StartDoc() //cria o documento

   oPrinter:SetFont("LUCIDA CONSOLE",12,{aIA,aIL},700,.F.,.F.) 

   nOrgAlt :=oPrinter:LineHeight()
   If aTl#Nil //altura da linha
      oPrinter:LineHeight :=Int(nOrgAlt-((nOrgAlt*aTl)/100))
   EndIf

   oPrinter:PosY:=0  //linha       
   oPrinter:PosX:=0  //coluna      


   If cPrModel=="MATRICIAL"  //se tiver escrito no nome da impressora "MATRICIAL", imprime pelo win_print

      If aNF=.F. // se nao for nota fiscal, se for passa reto usando a configuraçãoo da nota fiscal
         Prn_HANDLE:=FOpen(cArq,1) //abre o arquivo
         FSeek (Prn_HANDLE,0,1)    //POSICIONE NO INICIO DO ARQUIVO
         FWrite(Prn_HANDLE,cComI,1) //condensa o relatorio
         FSeek (Prn_HANDLE,0,2) //POSICIONE NO FIM DO ARQUIVO
         FWrite(Prn_HANDLE,cNorI) //volta ao normal
         FClose(Prn_HANDLE)
      EndIf

      Win_PrintFileRaw(cPrinter,cArq,"") //imprime

   Else //é GRAFICO, VAI NA LASER

      oPrinter:TextOut(Space(TamRel),.T.)
      cTexto  :=MemoRead(cArq)
      nLinhas :=mLCount(cTexto,TamRel,1,.F.)
      For nA:= 1 To nLinhas
          cLinha:=MemoLine(cTexto,TamRel,nA,1,.F.)
          aPosCa:=At("",cLinha)              //posicao do eject
          xLinha:=Left (cLinha,aPosCa)
          yLinha:=Right(cLinha,aPosCa)
          If aPosCa>0 //tem eject
             cLinha:=xLinha+yLinha
          EndIf
          If aPosCa>0.And.nA<nLinhas //SALTO_PAGINA
             oPrinter:NewPage()      //eject
          ElseIf (Left(AllTrim(cLinha),80)==Repl("Ä",80).Or.;
                  Left(AllTrim(cLinha),80)==Repl("-",80).Or.;
                  Left(AllTrim(cLinha),80)==Repl("_",80)).And.;
                  !Left(AllTrim(cLinha),100)==Repl("-",100)

             oPrinter:TextOut(Repl(hb_oemTOansI("-"),TamRel),.T.) //manda a nova linha separadora

          Else  // é texto a ser impresso

             oPrinter:TextOut(HB_oemTOansi(Left(cLinha,TamRel)),.T.) //imprime a linha

          EndIf

      Next
   EndIf

//// CREIO QUE TALVEZ SEJA NESTES COMANDOS ABAIXO A FALHA DE NÃO IR PARA A IMPRESSORA.

   oPrinter:EndDoc() //fecha o documento
   oPrinter:Destroy() //finaliza o documento e vai para impressão

/// 

Else
   ShowMessage(,,"Erro na criação do arquivo de impressão.",0)
EndIf
Return NIL

Lembrando que esta é apenas a classe que trata o documento para a impressão, antes dela eu chamo funções que captura a impressora desejada, etc.
Abaixo o restante dos códigos.

Código: Selecionar todos


If NewAnsWer("Confirma impressão?") .And. c_Imprime(File1Tmp) //função de preparar a inicialização da impressora desejada
   NewImprime() //cria os prow da vida em arquivo
   e_Imprime() //envia o arquivo acima para a impressora escolhida o qual pré-configura a IMPWIN32PRN()
EndIf

 //// abaixo as demais funções
Function c_Imprime(pPrinter,aPo,aLn)
Local aRet:=.T.
Local lIp

Public nPrinter:=If(pPrinter=Nil,"IMPRESSO",pPrinter)
aPo:=If(aPo=Nil,"V",aPo)
aLn:=If(aLn=Nil,If(aPo=="V",137,182),aLn) //tem que ser 137
cP_Printer:=wD_Retorno+nPrinter+".PRN" //manda tudo para o arquivo de impressãoo
aRet:=MyPrinters()

lIp:=If(("DATAMAX" $ Upper(cPrinter)),"DATAMAX","OUTRA")

If lIp=="DATAMAX"
	ShowMessage(,,"DATAMAX - Foi selecionado uma impressora etiquetadora, impressão cancelada.",0)
	aRet:=.F.
EndIf
If(aRet=.T.,ShowWait(,,"Imprimindo em "+cPrinter+"..."),.T.)
Return aRet

Function MyPrinters()
Local aRet:=.T.
Local hDC
Set Key -5 To

ShowWait(,,"Localizando impressoras")
hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas
CloseWindow()

If Empty(hDC)
	aRet:=.F. //para finalizar
Else
   cPrDoor:=WIN_PRINTERPORTTONAME(cPrinter) // pega a porta da impressora
   cPrModel:=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL".Or.Left(cPrDoor,2)$"\\","MATRICIAL","LASER") //verifica se é LASER ou MATRICAL para poder imprimir
   c_CfImpressora()  //CONFIGURA OS CHR

EndIf
Set Key -5 To MyPrinters()
Return aRet

Function e_Imprime(aLn,aPo,aTl,aNF,aIA,aIL)
Local o_mail
aPo:=If(aPo=Nil,"V",aPo)
aLn:=If(aLn=Nil,If(aPo=="V",137,182),aLn) //tem que ser 137
aTl:=If(aTl=Nil,Nil,aTl) //altura da linha
aIA:=If(aIA=Nil,1 ,aIA)
aIL:=If(aIL=Nil,18,aIL) //22 para o padrao maior mais cumprimido na linha são mais caracteres na linha, menor menos caracteres na linha
aNF:=If(aNF=Nil,.F.,aNF)
If Right(cP_Printer,3)=="PRN" //‚ arquivo
   If cPrDoor$"File" //se for arquivo
      FRename(wD_Retorno+nPrinter+".PRN",wD_Retorno+cP_Printer+".TXT") 
   Else
      ImpWIN32PRN(wD_Retorno+nPrinter+".PRN",aLn,aPo,aTl,aNF,aIA,aIL) //manda para o arquivo prn e envia para a impressora
      FErase(wD_Retorno+nPrinter+".PRN") //apaga prn
   EndIf

  //reconfigura para a impressora padrao
   cPrinter  :=WIN_PRINTERGETDEFAULT() //HB_GetDefaultPrinter()
   cPrModel :=If(SubStr(Upper(cPrinter),At("MATRICIAL",Upper(cPrinter)),9)=="MATRICIAL","MATRICIAL","LASER")
   cPrDoor   :=If(cPrModel=="MATRICIAL","LPT1","USB") 
   cP_Printer:=cPrDoor
   nPrinter  :=""
EndIf
CloseWindow()
Return .T.

Grato.

:)Pos

win_prn, ajuda com código

Enviado: 07 Nov 2014 01:03
por Jairo Maia
Olá Leandro,

Vou dar minha opinião:

1 - A linha 5 do seu exemplo não tem nenhum propósito. Exclua:

Código: Selecionar todos

oPrinter:=Win_prn() //CHAMA A WIN_PRN
2 - A ordem das coisas me parecem não estarem corretas, tente ajustar assim:

Código: Selecionar todos

oPrinter:New(cPrinter) //pega a escolhida

If !oPrinter:create()

 oPrinter:Landscape:=If(aPo=="H",.T.,.F.)  //VERTICAL=.F.  // HORIZONTAL=.T.
 oPrinter:FormType :=1
 oPrinter:Copies   :=1
 oPrinter:CharSet(255)
 oPrinter:SetPrintQuality(1) //qualidade da impressãoo 1 rascunho 2 normal 3 media 4melhor

 oPrinter:StartDoc() //cria o documento

 oPrinter:SetFont("LUCIDA CONSOLE",12,{aIA,aIL},700,.F.,.F.)
 
 // Restante do código...