Como imprimir cabeçalhos e rodapés com win32prn???
Moderador: Moderadores
- ERASMO ANDRIOLI
- Usuário Nível 2

- Mensagens: 51
- Registrado em: 15 Jul 2004 16:15
- Localização: Sorriso-MT
- Contato:
Como imprimir cabeçalhos e rodapés com win32prn???
Olá amigos....
Gostaria que postassem aqui no forum, exemplos simples e praticos de como imprimir cabeçalhos e rodapes pela classe Win32prn.
Percebi que ela ignora os comandos de comprimir e salto de pagina gerados pelo CLipper, parece que ela controla os fins de folha.
Obrigado.
Erasmo
Gostaria que postassem aqui no forum, exemplos simples e praticos de como imprimir cabeçalhos e rodapes pela classe Win32prn.
Percebi que ela ignora os comandos de comprimir e salto de pagina gerados pelo CLipper, parece que ela controla os fins de folha.
Obrigado.
Erasmo
- ERASMO ANDRIOLI
- Usuário Nível 2

- Mensagens: 51
- Registrado em: 15 Jul 2004 16:15
- Localização: Sorriso-MT
- Contato:
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
amigo, vai em busca e digita : win32prn
vc vai vai um monte de posts que resolverá seu problema
obrigado
vc vai vai um monte de posts que resolverá seu problema
obrigado
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
Erasmo:
A Classe Win32prn() obedece ao comando EJECT do Clipper, porém você não informou em qual impressora imprime e em que papel.
A Classe tem uma penca de vantagens, mas também algumas desvantagens. Nem tudo na vida é perfeito.
A Classe Win32prn possui um outro tipo de controle específico para páginas A4 e todos os outros tamanhos padrão.
Seja mais específico com a colocação do teu problema, e certamente alguém vai te auxiliar. Me ofereço também, se tiveres um pouco de calma, pois somente nos finais de tarde e nos finais de semana que tenho tempo para abrir o Fórum e os e-mails.
A Classe Win32prn() obedece ao comando EJECT do Clipper, porém você não informou em qual impressora imprime e em que papel.
A Classe tem uma penca de vantagens, mas também algumas desvantagens. Nem tudo na vida é perfeito.
A Classe Win32prn possui um outro tipo de controle específico para páginas A4 e todos os outros tamanhos padrão.
Seja mais específico com a colocação do teu problema, e certamente alguém vai te auxiliar. Me ofereço também, se tiveres um pouco de calma, pois somente nos finais de tarde e nos finais de semana que tenho tempo para abrir o Fórum e os e-mails.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
- ERASMO ANDRIOLI
- Usuário Nível 2

- Mensagens: 51
- Registrado em: 15 Jul 2004 16:15
- Localização: Sorriso-MT
- Contato:
COMPLEMENTAÇÃO DA AJUDA...
OK!!! Vocês venceram.... lá vai a pergunta objetiva:
Esse é parte do prog que imprime o relatorio em arquivo e ao final ele chama uma função IMPRIME para imprimir pela classe win:
// Agora vai postado a rotina da IMPRIME...
// è isso ai pessoal.... eu percebi que o Harbour está ignorando o
// comando eject e controle de fim e inicio de folha...
// Será que o controle da função IMPRIME deve ser compativel
// com a quantidade de linhas do arquivo .prn???
// Estou testando na HP Laser Jet 1018
Aguardo retorno, principalmente do MALIGNO...
Abraços
ERASMO
Esse é parte do prog que imprime o relatorio em arquivo e ao final ele chama uma função IMPRIME para imprimir pela classe win:
Código: Selecionar todos
************************
PROCEDURE EXT_IMP
************************
WIN(12,13,17,64,"AGUARDE!!! IMPRIMINDO...","GR+/N","N+/W")
FRAME(14,14,16,63)
arq_x ="C:\TEMP\"+LEFT(TIME(),2)+RIGHT(LEFT(TIME(),5),2)+RIGHT(TIME(),2)+"SI"+".PRN"
SET DEVICE TO PRINTER
SET PRINTER TO EXTRA.PRN // &arq_x
SELE 3
USE BNKLCTO SHARED ALIAS BANLAN
SET INDEX TO BNKLCTO
SET ORDER TO 4
DBGOTOP()
SALDO_ANT=0
LOCATE FOR CONTALCTO=COD_BCO .AND. DTMVLCTO < DTINIC
DO WHILE .T.
SUM VALORLCTO TO SALDO_A WHILE CONTALCTO=COD_BCO .AND. DTMVLCTO < DTINIC
SALDO_ANT=SALDO_ANT+SALDO_A
CONTINUE
IF FOUND()
LOOP
ENDIF
EXIT
ENDDO
TDTEMLCTO=DTEMLCTO
TDTMVLCTO=DTMVLCTO
TVALORLCTO=VALORLCTO
TNUMLCTO=NUMLCTO
THISTLCTO=HISTLCTO
THISTLCTO1=HISTLCTO1
TTPDOCLCTO=TPDOCLCTO
TTIPO=TIPO
TCONTALCTO=CONTALCTO
DBSEEK(COD_BCO)
P=1
PAGINA=1
control= 0
termom:= 53 / RECCOUNT()
porce := 100 / RECCOUNT()
DO WHILE .NOT. EOF()
SET DEVICE TO SCREEN
control++
@15,15+(control*termom) SAY "±" COLOR("BG+/W")
SET DEVICE TO PRINTER
TCONTALCTO = CONTALCTO
TDTMVLCTO = DTMVLCTO
TDTEMLCTO = DTEMLCTO
TVALORLCTO = VALORLCTO
TNUMLCTO = NUMLCTO
THISTLCTO = HISTLCTO
THISTLCTO1 = HISTLCTO1
TTPDOCLCTO = TPDOCLCTO
TTIPO = TIPO
IF PROW() = 0
@PROW(),0 SAY &m_i && Condensado ON Printer Select...
@PROW(),00 SAY REPLICATE("=",130)
@PROW()+1,00 SAY "BANK"
vtab = (130-LEN(RTRIM(empresa)))/2
* Centraliza o texto do aviso na tela
@prow(),vtab SAY empresa
@PROW(),120 SAY DATE()
@PROW()+1,00 SAY "Versao 1.0"
@PROW(),45 SAY sistema
@PROW(),45 SAY sistema
@PROW(),122 SAY TIME()
@PROW()+1,00 SAY REPL("=",130)
@PROW()+1,52 SAY "EXTRATO DE CONTA BANCARIA"
@PROW()+1,00 SAY REPL("-",130)
@PROW()+1,00 SAY "Conta:"
@PROW(),07 say STRZERO(COD_BCO,2,0)
@PROW(),10 SAY "-"
@PROW(),12 SAY TDESCRICAO
@PROW(),60 SAY "No.da Conta:"
@PROW(),75 SAY TCONTA
@PROW(),94 SAY "Banco: "+STUFF(PADL(TBANCO,4,"0"),4,0,"-")
@PROW()+1,00 say "Periodo do Extrato:"
@PROW(),20 say DTINIC
@PROW(),31 SAY "a"
@PROW(),33 SAY DTFINI
@PROW()+2,00 say "Data"
@PROW(),12 say "Lcto"
@PROW(),17 say "Historico"
@PROW(),66 say "Data Emissao"
@PROW(),84 say "Valor em R$"
@PROW(),96 say "D/C"
@PROW(),100 say "Tp"
@PROW(),118 say "Saldo em R$"
ENDIF
IF P=1
@PROW()+1,17 SAY "S A L D O A N T E R I O R"
@PROW(),107 SAY SALDO_ANT PICT("999,999,999,999,999.99")
P=P+1
* Cria variavel de nome S_INI sendo igual ao saldo anterior
S_INI=SALDO_ANT
ENDIF
IF CONTALCTO = COD_BCO .AND. DTMVLCTO < DTINIC
DBSKIP()
LOOP
ENDIF
IF CONTALCTO = COD_BCO .AND. DTMVLCTO > DTFINI
DBSKIP()
LOOP
ENDIF
IF CONTALCTO <> COD_BCO
DBSKIP()
LOOP
ENDIF
@PROW()+1,00 SAY TDTMVLCTO
@PROW(),12 SAY STRZERO(TNUMLCTO,4,0)
@PROW(),17 SAY THISTLCTO
IF THISTLCTO1 <> ""
@PROW()+1,17 SAY THISTLCTO1
ENDIF
@PROW(),68 SAY TDTEMLCTO
* M ostrar Valor em Positivo caso seja Negativo...
@PROW(),81 SAY abs(TVALORLCTO) PICT "999,999,999.99"
@PROW(),97 SAY TTIPO
@PROW(),100 SAY STRZERO(TTPDOCLCTO,2,0)
S_INI=S_INI+TVALORLCTO
@PROW(),107 SAY S_INI PICT("999,999,999,999,999.99")
DBSKIP()
IF PROW() = 56 .OR. PROW() > 56
@PROW()+1,0 SAY REPL("=",130)
@PROW()+1,0 SAY eu+mfone
@prow(),121 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
@prow()+1,0 SAY repl("=",130)
PAGINA++
eject
ENDIF
ENDDO
@PROW()+1,17 SAY "S A L D O A T U A L"
@PROW(),107 SAY S_INI PICT("999,999,999,999,999.99")
DO WHILE PROW() < 56
@PROW()+1,0 SAY ""
ENDDO
@PROW()+1,0 SAY REPL("=",130)
@PROW()+1,0 SAY eu+mfone
@prow(),121 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
@prow()+1,0 SAY repl("=",130)
EJECT
SET DEVICE TO SCREEN
SET PRINTER TO
IMPRIME(,,"C")
RETURNCódigo: Selecionar todos
*********************************************
FUNC Imprime( cArq,cPrinter,tam )
*********************************************
aPrn := GETDEFAULTPRINTER() // vai pegar a impressora padrao...
tamrel:=tam
IF .NOT. FILE("EXTRA.PRN")
RETURN
ELSE
cFILE := "BK"+ ALLTRIM( STR( RANDOM(9999) ))+".PRN"
COPY FILE EXTRA.PRN TO (cFILE)
DELETE FILE EXTRA.PRN
ENDIF
If Empty(aPrn)
alert("Nao ha'Impressora Instalada!!!")
else
IMPRES(cFILE,aPrn,tamrel)
EndIf
DELETE FILE TEXTO.DBF
RETURN
*----------------------------- // ImpressÆo Xharbour cont...
FUNC IMPRES( cArq,cPrinter,tam )
*-----------------------------
local cTexto, nLinhas, cLinha
local oPrinter := win32prn():New(cPrinter)
oPrinter:Landscape := .F.
oPrinter:FormType := 9
oprinter:SetPrintQuality(-1)
oPrinter:Copies := 1
IF FILE("logo.bmp") // se tiver o arquivo logo.bmp dentro da mesma pasta
aTamlog := 9 // ele vai imprimir o logo primeiro
else
aTamlog := 0
endif
DELETE FILE TEXTO.DBF
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate("TEXTO.DBF", vARQ)
SELE 40
USE TEXTO ALIAS TELA EXCL
SELE TELA
append from (cArq) sdf
IF !oPrinter:Create()
return NIL
ELSE
IF .not. oPrinter:StartDoc("BANK")
return NIL
endif
PrintBitMap( oPrinter )
FOR TT=1 TO aTamlog
oPrinter:newline()
NEXT
if tam = "C"
oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
MSGBOX1("IMPRIMINDO COMPRIMIDO...")
else
oPrinter:SetFont("Courier New",,11,,,,255) // Normal
MSGBOX1("IMPRIMINDO NORMAL...")
endif
oPrinter:Bold(0)
SELE TELA
dbgotop()
Do while !eof()
cLinha := Tela->Linha
oPrinter:newline()
oPrinter:SetFont("Courier New",11,{3,-50})
oPrinter:TextOut(cLinha)
oPrinter:Bold(0)
dbskip()
if !eof()
if (oPrinter:MaxRow() - 2) <= oPrinter:Prow()
oPrinter:NewPage() // novo pagina
PrintBitMap( oPrinter ) // imprimindo o logotipo de novo
FOR TT=1 TO aTamlog
oPrinter:newline()
NEXT
endif
endif
enddo
oPrinter:EndDoc()
oPrinter:Destroy()
ENDIF
SELE TELA
USE
RETURN NIL
FUNC PrintBitMap( oPrn ) //função para imprimir imagem do logotipo
LOCAL oBMP
oBMP:= Win32BMP():new()
oBmp:loadFile( "logo.bmp" )
oBmp:Draw( oPrn, { 200,200,500,500 } )
oBMP:Destroy()
RETURN
FUNC Random( nLimite ) // função para criar um arquivo temporario
static nGuarda:= 1
local I
local nResult
if ValType( nLimite ) # [N]
nLimite:= 100
endif
I:= Seconds()
while nLimite > I
I:= I * 100 +Seconds()
enddo
nGuarda:= (nGuarda +I) / (nResult:= nGuarda * I % nLimite +1)
nResult:= Int( nResult )
return nResult // comando eject e controle de fim e inicio de folha...
// Será que o controle da função IMPRIME deve ser compativel
// com a quantidade de linhas do arquivo .prn???
// Estou testando na HP Laser Jet 1018
Aguardo retorno, principalmente do MALIGNO...
Abraços
ERASMO
Editado pela última vez por Pablo César em 20 Mar 2012 17:10, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
- ERASMO ANDRIOLI
- Usuário Nível 2

- Mensagens: 51
- Registrado em: 15 Jul 2004 16:15
- Localização: Sorriso-MT
- Contato:
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
amigo ele nao esta ignorando, vc tem que varrer seu txt e substituir os caracteres do EJECT pelo correspondente do win32prn
Código: Selecionar todos
valbuf = 11000
arq=FOPEN(cArq,0)
do while .t.
buffer=SPACE(valbuf)
FSEEK(arq,atu,0)
bytes=FREAD(arq,@buffer,valbuf)
pos=AT(CHR(12),buffer)
if bytes=0 .OR. pos=0
exit
endif
bloco=substr(buffer,1,pos)
linhaImpressao=""
for x=1 to len(bloco)
ch=substr(bloco,x,1)
do case
case ch = FIM_LINHA
oPrinter:TextOut( strtran(linhaImpressao,chr(13),""), .t. )
linhaImpressao=""
barra:Step()
case ch = FIM_PAGINA
oPrinter:TextOut( strtran(linhaImpressao,chr(13),""), .t. )
oPrinter:NewPage()
//PrintBitMap( oPrinter )
linhaImpressao=""
barra:Step()
otherwise
linhaImpressao+=ch
endcase
next
atu=atu+pos
enddo
oPrinter:EndDoc()
oPrinter:Destroy()
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
Olá Erasmo.
Não entendí porque você mistura impressão Clipper com impressão via Classe Win32prn().
Você acaba confundindo todo o sistema. A contagem de linhas fica embaralhada.
Ou você imprime a página toda via Clipper ou via Win32prn().
Transponha tudo para Win32prn() e verás perfeito funcionamento.
Não entendí porque você mistura impressão Clipper com impressão via Classe Win32prn().
Você acaba confundindo todo o sistema. A contagem de linhas fica embaralhada.
Ou você imprime a página toda via Clipper ou via Win32prn().
Transponha tudo para Win32prn() e verás perfeito funcionamento.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
- ERASMO ANDRIOLI
- Usuário Nível 2

- Mensagens: 51
- Registrado em: 15 Jul 2004 16:15
- Localização: Sorriso-MT
- Contato:
RESPOSTA...
Pois é...
o problema é que não quero mudar todos os meus fontes de relatórios, são muitos, hoje eles geram arquivos .prn que eu mando imprimir pelo DOSPRINT.
Como estou mudando para XHarbour, quero apenas implementar uma função que leia o arquivo pronto e mande imprimir. Lembro-lhes que esses arquivos tem cabeçalhos e rodapés formatados com saltos de paginas pelo EJECT.
Nas rotinas com impressora matricial vou usar o PRINTFILERAW para evitar dor de cabeças... é isso...
Más até o momento não achei nada fácil para usar na impressão desses documentos prontos (os arquivos .prn).
Queria que alguem colocasse um exemplo bem simples mesmo, para ler um arquivo .prn, e imprimir via classe win32prn.
O negócio tem que bate e vale.... sem xurumelas...
-:]
Saudações
o problema é que não quero mudar todos os meus fontes de relatórios, são muitos, hoje eles geram arquivos .prn que eu mando imprimir pelo DOSPRINT.
Como estou mudando para XHarbour, quero apenas implementar uma função que leia o arquivo pronto e mande imprimir. Lembro-lhes que esses arquivos tem cabeçalhos e rodapés formatados com saltos de paginas pelo EJECT.
Nas rotinas com impressora matricial vou usar o PRINTFILERAW para evitar dor de cabeças... é isso...
Más até o momento não achei nada fácil para usar na impressão desses documentos prontos (os arquivos .prn).
Queria que alguem colocasse um exemplo bem simples mesmo, para ler um arquivo .prn, e imprimir via classe win32prn.
O negócio tem que bate e vale.... sem xurumelas...
-:]
Saudações
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
Caro Erasmo,
meu sistema tem exatamente 230 relatórios diferentes, todos feitos em clipper quando mudei para xharbour nao precisei mudar absolutamente nada neles, bastava imprimi-los para TXT (set printer to arquivo.txt) e depois abrir esse txt via funçäo de baixo nível e pegando linha a linha e mandando imprimir via win32prn, conforme funcao que eu te mandei ai em cima...
ta funcionando perfeitamente...
boa sote
meu sistema tem exatamente 230 relatórios diferentes, todos feitos em clipper quando mudei para xharbour nao precisei mudar absolutamente nada neles, bastava imprimi-los para TXT (set printer to arquivo.txt) e depois abrir esse txt via funçäo de baixo nível e pegando linha a linha e mandando imprimir via win32prn, conforme funcao que eu te mandei ai em cima...
ta funcionando perfeitamente...
boa sote
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim