Página 1 de 2

Win32Prn() Número de cópias sempre 1

Enviado: 18 Set 2010 18:30
por lugab
Pessoal, eu estou fazendo coisa errada no Win32prn(), pra variar.

Eu desejo imprimir 3 vezes o mesmo relatório, mas o código abaixo não está funcionando adequadamente e por isso só esta imprimindo uma única cópia do relatório.

Observem que eu coloquei 3 no parâmetro oPrinter:Copies.

Código: Selecionar todos

*----------------------------------------
Function impWinPrint(cPrinter,xarqtxt)
*-----------------------------------------
#define DMPAPER_A4                   9  // A4 210 x 297 mm 
LOCAL oPrinter:= Win32Prn():New(cPrinter), aFonts, x, nColFixed,nColTTF, nColCharSet
LOCAL ncarpol, i, nHandle, cString
oPrinter:Landscape:= .F.
oPrinter:FormType := DMPAPER_A4
oPrinter:Copies   := 3
oPrinter:SetPrintQuality(1) 
IF !oPrinter:Create()
   Alert(" Impressora näo pode ser criada !!! ")
   RETURN
ELSE
   IF !oPrinter:startDoc("TPRINT("+xarqtxt+")")
     Alert("StartDoc() falhou !!!")
     oPrinter:destroy()
     RETURN
   ENDIF
ENDIF

nHandle:= FOPEN( xarqtxt ) // READ
cString:= ""
xmaxLen:= 0
FOR i:= 1 TO 10
    IF gfreadline( @cString, nHandle )
       IF LEN( cString ) > xmaxLen
          xmaxLen:= LEN( cString )
       ENDIF
    ELSE
       EXIT
    ENDIF
NEXT

IF xmaxLen <= 85
    ncarpol:= 11
ELSEIF xmaxlen <= 100
    ncarpol:= 13
ELSEIF xmaxlen <= 136
    ncarpol:= 18
ELSEIF xmaxlen <= 160
    ncarpol:= 21
ENDIF

oPrinter:SetFont('Courier New',,ncarpol)
fSeek( nHandle, 0 )

cString:= ""
xprow:=0
endof_file=.f.
while !endof_file
    gfreadline( @cString, nHandle )
    IF ( xpos:= AT( CHR(12), cString ) ) > 0
       cString:= LEFT( cString, xpos-1 ) + SUBS( cString, xpos + 1, LEN( cString ) )
    ENDIF
    oPrinter:TextOut(cString)
    oPrinter:NewLine()
    IF xpos > 0
       oPrinter:NewPage()
       oPrinter:SetFont('Courier New',,ncarpol)
       oPrinter:NewLine()
       xprow:=0
    ELSE
       xprow++
    ENDIF
enddo

oPrinter:EndDoc()
oPrinter:Destroy()

fclose(nHandle)

RETURN(NIL)
// EOF - impWinPrint()

*---------------------------
procedure gfreadline(st,handle)
*---------------------------
st=xfgetline(handle)
return .t.


*---------------------------
function xfgetline(script)
*-------------------------
local return_lin, chunk, bigchunk, oldoffset, at_chr13
return_lin = ''
bigchunk = ''
oldoffset = fseek (script, 0, 1)
do while .t.
   chunk = ''
   chunk = freadstr (script, 100)
   if len (chunk) = 0
      endof_file = .t.
      exit
   endif
   bigchunk = bigchunk + chunk
   if at (chr (10), bigchunk) > 0
      at_chr13 = at (chr (10), bigchunk)
      fseek (script, oldoffset)
      return_lin = freadstr (script, at_chr13 - 1)
      exit
   endif
enddo
fseek (script, 1, 1)
if right(return_lin,1)=chr(13)
   return_lin:=left(return_lin,len(return_lin)-1)
end if
return return_lin

Eu usava este código no xharbour 1.0 e agora estou usando-o, sem modificaçoes, no harbour 2.0 e não sei se essa mudança tem algo a ver como o não funcionamento do "oPrinter:copies".

Obrigado a quem dedicar seu tempo a solução do meu problema

Gabriel

Re: Win32Prn() Número de cópias sempre 1

Enviado: 19 Set 2010 19:47
por Stanis Luksys
Opa, beleza?

Eu sei que é uma solução idiota, mas enquanto não resolve você poderia fazer um FOR e passar o número de cópias como parâmetro nesta função "impWinPrint"...

Eu nunca usei esta lib, mas de qualquer forma vou dar uma olhadinha aqui e mais tarde vemos se há melhor solução.

Abraços!

Re: Win32Prn() Número de cópias sempre 1

Enviado: 19 Set 2010 20:49
por lugab
É Stanis, eu to me virando é com o "for" mesmo...

Mas não é viável alterar todos as dezenas de relatórios, por conta de uma função tão pequena, com problema de mau funcionamento..

Obrigado , mesmo assim..

Gabriel

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 13:05
por sygecom
Eu uso oPrinter:Copies sem problemas, por acaso você está fazendo o teste no PdfCreator ? se sim, não sei por que mas não funciona as vezes, faça o teste em impressora real.

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 13:43
por lugab
Oi Leonardo,

É na impressora mesmo, a mesma jato-de-tinta de sempre.

Será que o código q vc etá usando é o mesmo ?

Este código funcionava bem no Xharbour 1.0 , mas agora estou usando ele no Harbour 2.0 e os problemas surgiram.

Além de não enviar N cópias pra impressora, o código tb não imprime a última linha gerada, nem na impressora e nem no Pdfcreator..

É sinsitro !

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 13:51
por sygecom
Olá Gabriel,
Eu uso no xHarbour 1.2.1 e o meu laço que le linha a linha está assim:

Código: Selecionar todos

   nLines := mlcount( cText, 150 )
   for nA := 1 to nLines
      cLine := memoline( cText, 150 , nA, 1, .F. )

      IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 )
         loop
      ENDIF

      If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif

      oPrinter:TextOut( cLine, .T. )
      oPrinter:Bold(0) // Normal

      if (oPrinter:MaxRow()-2 ) <= oPrinter:Prow()
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif
   next

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 17:53
por lugab
Leonardo, em vez de só o laço, tem como tu postar o impwinprint () todo, com Fgetline() , laço e tudo o mais ?

Acho mais produtivo copiar e testar ele todo, do que comparar linha-a-linha..

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 20:33
por sygecom
Ex:
IMPRIME('TEXTO.TXT',136,GetDefaultPrinter(),2,.F.)

Código: Selecionar todos

*****************************************************************
FUNCTION IMPRIME( cArq, tamrel ,cPrinter, cCopias, vIMPPAISAGEM )
*****************************************************************
local cTexto, nLinhas, nA, cLinha, oBMP, nFileHandle, cLine, nLINE_TEMP:=0
#ifdef __XHARBOUR__
local oPrinter:= win32prn():New(cPrinter)
#else
local oPrinter:= win_prn():New(cPrinter)
#endif

cText := memoread( cArq )

oPrinter:Landscape:= vIMPPAISAGEM
oPrinter:FormType:= 9
oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies:=cCopias

IF !oPrinter:Create()
   MsgStop("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar se a Impressora esta Ligada.","Aviso do Sistema")
   return NIL
else
   IF !oPrinter:StartDoc("Impressao Pelo Sistema")
      MsgStop("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar a Impressora","Aviso do Sistema")
      Return NIL
   endif

   FOR TT=1 TO 2
      oPrinter:newline()
   NEXT

   IF TAMREL=80
      oPrinter:setfont('Courier New',,12,,,,255) // Normal
      nLines2 := 85
   ELSE                                 //{3,-60,160}
      IF vIMPPAISAGEM=.T.
         oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) // Comprimida
         nLines2 := 190
      ELSE
         oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) // Comprimida
         nLines2 := 150
      ENDIF
   ENDIF
   oPrinter:Bold(0) // Normal

   nLines := mlcount( cText, nLines2 )
   for nA := 1 to nLines
      cLine := memoline( cText, nLines2, nA, 1, .F. )

      IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 )
         loop
      ENDIF

      If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif

      oPrinter:TextOut( cLine, .T. )
      oPrinter:Bold(0) // Normal

      if (oPrinter:MaxRow()-2 ) <= oPrinter:Prow()
         oPrinter:NewPage()
         FOR TT=1 TO 2
            oPrinter:newline()
         NEXT
      endif
   next

   oPrinter:EndDoc()
   oPrinter:Destroy()
ENDIF
RETURN NIL
com Fgetline()
Não sei o que é esse FgetLine() ....

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 21:26
por lugab
Obrigao, Leonardo.

Vou checar, claro, porém, eu já vi 2 novidades, pelo menos para mim..

1 ) Tu pode dizer a diferença entre Win32Prn() e win_Prn(), no seu código ?

2) Pode dizer onde acho a função GetDefaultPrinter() ?

Grato,

Gabriel

Re: Win32Prn() Número de cópias sempre 1

Enviado: 21 Set 2010 21:44
por sygecom
Olá Gabriel,
lugab escreveu: 1 ) Tu pode dizer a diferença entre Win32Prn() e win_Prn(), no seu código ?
Win32Prn() é para compilar usando xHarbour e win_Prn() é para compilar usando Harbour
2) Pode dizer onde acho a função GetDefaultPrinter() ?
GetDefaultPrinter() é para xHarbour, para Harbour é win_PrinterGetDefault() e ambas serve para buscar a impressora padrão do Windows.

Re: Win32Prn() Número de cópias sempre 1

Enviado: 22 Set 2010 08:39
por lugab
Pronto, Leonardo, o meu problema era só receber essa informação q vc postou:
  • "Win32Prn() é para compilar usando xHarbour e win_Prn() é para compilar usando Harbour"
Obrigado mais uma vez. Só troquei o win32prn(0 por win_prn() no meu código e ai o paramentro "Copies "funcionou.

Entretanto, aproveito o ensejo pra meter o pau no me código, pq ele nunca mandou a última linha do arquivo texto para impressão.
Eu olho o código, o código olha pra mim e nada de acordo. A rotina siumplesmente só imprime até N-1 linhas

Alguém tem tempo de olhar esse código e dizer o que fazer, pra imprimir tb a última linha ?

Código: Selecionar todos

*----------------------------------------
Function impWinPrint(cPrinter,xarqtxt)
*-----------------------------------------
Local oPrinter:= Win_Prn():New(cPrinter), aFonts, x, nColFixed,nColTTF, nColCharSet
Local ncarpol, i, nHandle, cString
oPrinter:FormType := 9
oPrinter:Copies   := 3
oPrinter:SetPrintQuality(-4) // qualidade impressao
oPrinter:Landscape:= .F.  && retrato

IF !oPrinter:Create()
   Alert(" Impressora näo pode ser criada !!! ")
   return
else
   IF !oPrinter:startDoc("TPRINT("+xarqtxt+")")
     Alert("StartDoc() Falha na Impressora !")
     oPrinter:destroy()
     return
   endif
endif

nHandle:= Fopen( Xarqtxt ) // READ
cString:= ""
xmaxLen:= 0
For I:= 1 to 10
    IF gfreadline( @cString, nHandle )
       If len( CString ) > xmaxLen
          xmaxLen:= Len( cString )
       endif
    else
       exit
    endif
next 
// Ncarpol=caracteres por polegada
IF xmaxLen <= 85
       ncarpol:= 11
   Elseif Xmaxlen <= 100
       ncarpol:= 13
   Elseif Xmaxlen <= 136
       ncarpol:= 18
   Elseif Xmaxlen <= 160
       ncarpol:= 21
   Endif
Endif

oPrinter:SetFont('Courier New',,ncarpol)

fSeek( nHandle, 0 )

cString:= ""
xprow:=0
endof_file=.f.
while !endof_file
    gfreadline( @cString, nHandle )
    IF ( xpos:= AT( CHR(12), cString ) ) > 0
       cString:= LEFT( cString, xpos-1 ) + SUBS( cString, xpos + 1, LEN( cString ) )
    ENDIF
    oPrinter:TextOut(cString)
    oPrinter:NewLine()
    IF xpos > 0
       oPrinter:NewPage()
       oPrinter:SetFont('Courier New',,ncarpol)
       oPrinter:NewLine()
       xprow:=0
    ELSE
       xprow++
    ENDIF
enddo

oPrinter:EndDoc()
oPrinter:Destroy()
fclose(nHandle)
RETURN(NIL)


*---------------------------
procedure gfreadline(st,handle)
*---------------------------
st=xfgetline(handle)
return .t.


*---------------------------
function xfgetline(script)
*-------------------------
local return_lin, chunk, bigchunk, oldoffset, at_chr13
return_lin = ''
bigchunk = ''
oldoffset = fseek (script, 0, 1)
do while .t.
   chunk = ''
   chunk = freadstr (script, 100)
   if len (chunk) = 0
      endof_file = .t.
      exit
   endif
   bigchunk = bigchunk + chunk
   if at (chr (10), bigchunk) > 0
      at_chr13 = at (chr (10), bigchunk)
      fseek (script, oldoffset)
      return_lin = freadstr (script, at_chr13 - 1)
      exit
   endif
enddo
fseek (script, 1, 1)
if right(return_lin,1)=chr(13)
   return_lin:=left(return_lin,len(return_lin)-1)
end if
return return_lin



Win32Prn() Número de cópias sempre 1

Enviado: 07 Fev 2024 16:36
por leandrolinauer
Boa tarde.
Estive pesquisando como colocar varias copias para imprimir usando a win32prn ou em harbour win_prn.
Não obtive exito, não obedece alinha abaixo
oPrinter:Copies :=3 //aqui defini a quantidade para testar e nao da certo

Aproveitando, pergunto como pegar a quantidade de copias alteradas na funcao

hDc := WIN_PRINTDLGDC( @cPrinter, , , ) //mostra a tela de dialog do windows para escolher as impressoras instaladas
função que abre a janela de impressoras do windows, precisava pegar a quantidade para enviar para
oPrinter:Copies := pegar a quantidade da win_printdlgdc()

Grato.
Código abaixo:

Código: Selecionar todos

Function NewImprimePRN_LS(cArq,tamrel,aPo,aTl,aNf,aIA,aIL,aFL,aMo) // arquivo e tamanho da linha
Local cTexto, nLinhas, nA, cLinha, oPrinter, cFILE, aCt:=.T.
Local aAltLetra:=10
Local mAltLetra:=1 //.10
oPrinter:=Win_prn():New(cPrinter) //tem que colocar porque senao nao cria o metodo
//oPrinter:=Win32Prn():new(cPrinter) uso a de cima em harbour 3.4
If oPrinter:create()
   oPrinter:Landscape:=If(aPo=="H",.T.,.F.)  //VERTICAL=.F.  // HORIZONTAL=.T.
   oPrinter:FormType :=If(cPrModel=="MATRICIAL",DMPAPER_LETTER,DMPAPER_A4) //decima
   oPrinter:Copies   :=3 //aqui defini a quantidade para testar e nao da certo
   oPrinter:CharSet(255)
   oPrinter:SetPrintQuality(1) //qualidade da impressãoo 1 rascunho 2 normal 3 media 4melhor
  //Showmessage(,,Str(oPrinter:Copies,2),0) //mostro pra ver se realmente esta em 3 copias e mostra 3
     If oPrinter:StartDoc("Impressao pelo sistema") //DENTRO COLOCO O NOME DO ARQUIVO ! oPrinter:startDoc( "win_Prn(Doc name in Printer Properties)" )
      If cPrModel=="MATRICIAL" 
         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) //comprimir
            FSeek (Prn_HANDLE,0,2) //POSICIONE NO FIM DO ARQUIVO
            FWrite(Prn_HANDLE,cNorI) //normal
            FClose(Prn_HANDLE)
         EndIf
         If aMo=.T. //imprime
            Win_PrintFileRaw(cPrinter,cArq,"")
         EndIf   
      Else 
         nOrgAlt :=oPrinter:LineHeight()
         oPrinter:LineHeight := nOrgAlt * mAltLetra //1.10 aumenta em 10% a linha erro
         oPrinter:CharSet( 0 )  // Reset default charset
         If aTl# Nil //altura da linha  controla etiqueta
            oPrinter:LineHeight :=Int(nOrgAlt -((nOrgAlt * aTl ) / 100))
         EndIf
         oPrinter:PosY:=0  //linha          |
         oPrinter:PosX:=0  //coluna        x --->
         oPrinter:SetFont("LUCIDA CONSOLE",aAltLetra,{aIA,aIL},0,.F.,.F.) //ficou menos agredido na folha nao aceita negrito
         oPrinter:SetColor( BLACK )
         oPrinter:Bold( 500 )
         oPrinter:TextOut(Space(TamRel),.T.) //captura o camanho
         cTexto  :=MemoRead(cArq)
         nLinhas :=mLCount(cTexto,TamRel,1,.F.)
         oEject  :=.F.
         oNegrito:=.F.
         oItalico:=.F.
         For nA:= 1 To nLinhas
             cLinha:=MemoLine(cTexto,TamRel+2,nA,1,.F.)   //+2 para pegar possivel eject
             oNegrito:=.F.
             oItalico:=.F.
	    aPosCa:=At("",cLinha)  //posicao do eject

             If Left(cLinha,3)=="<b>"
                cLinha:=SubStr(cLinha,4,TamRel-1) //pego da direta para esquerda para nao pegar o segundo caracter do eject
                oNegrito:=.T.
                oPrinter:LineHeight := nOrgAlt * mAltLetra//1.10 aumenta em 10% a linha a proxima linha
                oPrinter:SetFont("Courier New",aAltLetra+1,{1,18},0,.F.,.F.) //ficou menos agredido na folha
                oPrinter:Bold(700)
             EndIf
             If Left(cLinha,3)=="<i>"
                cLinha:=SubStr(cLinha,4,TamRel-1) //pego da direta para esquerda para nao pegar o segundo caracter do eject
                oItalico:=.T.
                oPrinter:Italic(.T.)
             EndIf

             If aPosCa > 0 .And. nA < nLinhas //SALTO_PAGINA  para nao fazer na primeira
             	 oEject:=.T.
                If aPosCa=1 //tem eject
                   cLinha:=Right(cLinha,TamRel)
                Else
                   cLinha:=Left(cLinha,TamRel)
		EndIf   
                If nA+1 < nLinhas .And. (!Empty(cLinha) .Or. oEject=.T.)//se for cabeçalho abre nova pagina com duas linhas em branco senao é rodape, nao abre a pagina
                   oPrinter:NewPage()  //precisa para abrir nova pagina
                EndIf
	     EndIf	      //eject
             If Empty(cLinha) //nova para no grafico ele pular linha quando necessario
                oPrinter:NewLine()
             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(My_OemToAnsi("-"),TamRel),.T.)
             Else
                cLinha:=MyWin_AnsiToOem(cLinha)
      	 	    oPrinter:TextOut(My_OemToAnsi(Left(cLinha,TamRel)),.T.)
             EndIf
   	     If oNegrito=.T.
                oPrinter:LineHeight := nOrgAlt * mAltLetra //1.15
                oPrinter:SetFont("LUCIDA CONSOLE",aAltLetra,{aIA,aIL},0,.F.,.F.) //ficou menos agredido na folha
                oPrinter:SetColor( BLACK )
                oPrinter:Bold(500)
             EndIf
             If oItalico=.T.
                oPrinter:Italic(.F.)
             EndIf
         Next
      EndIf
    EndIf   
   oPrinter:EndDoc()
   oPrinter:Destroy()
   MyFErase(wD_Retorno+nPrinter+".PRN") //apaga prn
Else
   ShowMessage(,,"Erro na criação do arquivo de impressão.",0)
EndIf
Return NIL

Win32Prn() Número de cópias sempre 1

Enviado: 07 Fev 2024 16:54
por JoséQuintas
Eu começaria fazendo um teste ao contrário:

Código: Selecionar todos

? oPrinter:Copies
Pra saber se existe :copies

E outro teste depois da atribuição, talvez seja somente leitura

Conforme o resultado, vai indicar pra onde correr.

Win32Prn() Número de cópias sempre 1

Enviado: 08 Fev 2024 10:40
por leandrolinauer
Bom dia,
Já fiz o teste e realmente mostra alterado.
oPrinter:Copies :=3 //aqui defini a quantidade para testar e nao da certo
oPrinter:CharSet(255)
oPrinter:SetPrintQuality(1) //qualidade da impressãoo 1 rascunho 2 normal 3 media 4melhor
Showmessage(,,Str(oPrinter:Copies,2),0) //mostro pra ver se realmente esta em 3 copias e mostra 3

o resto do código é o mesmo e não respeita a quantidade de copies no oprinter.
Até tentei colocar um FOR pra ir refazendo até o final da copia, nem isto obedece, imprime apenas uma.

Win32Prn() Número de cópias sempre 1

Enviado: 08 Fev 2024 12:17
por JoséQuintas
Achei na internet, veja se funciona.

Código: Selecionar todos

oPrinter:SetCopies( 3 )
https://fivewin.com.br/index.php?/topic ... etprintdc/