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:
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")
RETURN
// Agora vai postado a rotina da IMPRIME...
Có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
// è 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