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:
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