Tche, Luciano eu tmb. tinha essa duvida uma classe tão boa para impressão, pq não tem Preview() ? Bom a unica explicação que encontrei é pq a mesma classe pode ser usada tanto em console como em modo GUI e isso é uma vantagem inorme, a questão do Preview no meu caso, eu uso três diferente um para Relatorios em GUI(HWGUI-HPRINTER),outro para compatibilidade com CHR() via HWGUI tmb e outro para
CONSOLE(VIA TROWSE).
Bom Abaixo vou postar os Dois modos que são via HWGUI. Todos os dois são baseados que vc já gerou um TXT do que vc quer visualizar.
Ex 01,Quem postou esse exemplo foi o Colega Basso todos os créditos são dele, eu apenas inclui as opções de gerar word,pdf e email:
*************************************************************
Código: Selecionar todos
#define ID_TEXTO 300
********************
FUNCTION Edicao(cFile)
********************
LOCAL oDlg
Local oFont
Local lText := hb_oemtoansi(MemoRead(cFile))
or_Text=cFile
nsizefont := -13
PREPARE FONT oFont NAME "COURIER NEW" WIDTH 0 HEIGHT 0 WEIGHT -13
oFont2 := HFont():Add( "Courier New",0,-13 )
oFont3 := HFont():Add( "Ms Sans Serif",0,-10 )
INIT DIALOG oDlg TITLE "Visualização de Relatório" ;
AT 0,0 SIZE GETDESKTOPWIDTH(),GETDESKTOPHEIGHT();
FONT oFont
@ 88,19 RichEdit oEdit TEXT lText SIZE GETDESKTOPWIDTH()-100,GETDESKTOPHEIGHT()-100;
OF oDLG ID ID_TEXTO;
COLOR 0 BACKCOLOR 16777215 ;
ON getfocus {|| TopoDoc()};
STYLE WS_HSCROLL+WS_VSCROLL+ES_LEFT+ES_MULTILINE+ES_READONLY;
FONT oFont2
@ 6,30 BUTTON cmd1 Caption " - Zoom" ON CLICK {|| ZOOMIMP2(oEdit,'-')} SIZE 75,32 FONT oFont3
@ 6,80 BUTTON cmd1 Caption " + Zoom" ON CLICK {|| ZOOMIMP2(oEdit,'+')} SIZE 75,32 FONT oFont3
@ 6,130 BUTTON "Imprimir" ON CLICK {||EndDialog(),CHAMAIMP("S",or_Text)} SIZE 75,32 FONT oFont3
@ 6,180 BUTTON "Gera Pdf" ON CLICK {||EndDialog(),GERA_PDF(or_Text)} SIZE 75,32 FONT oFont3
@ 6,230 BUTTON "Gera Word" ON CLICK {||EndDialog(),Abre_word(or_Text)} SIZE 75,32 FONT oFont3
@ 6,280 BUTTON "E-Mail" ON CLICK {||EndDialog(),VAIEMAIL(or_Text)} SIZE 75,32 FONT oFont3
@ 6,330 BUTTON "Fechar" ON CLICK {||EndDialog()} SIZE 75,32 STYLE WS_TABSTOP FONT oFont3
ACTIVATE DIALOG oDlg
RETURN
**************
FUNC CHAMAIMP
**************
LOCAL nPrn
LOCAL aPrn := GetPrinters()
PARA TAM,cARQ // S=136 N=79
IF TAM=Nil
TAM="S"
ENDIF
EndDialog()
If Empty(aPrn)
OBRIGA11()
Return
EndIf
IF !EMPTY(cARQ)
cFILE := cARQ
ENDIF
nPrn:=PRINTSETUPEX()
IF TAM="S"
IF !EMPTY(nPrn)
Imprime(cFILE,136,nPrn)
ENDIF
ELSE
IF !EMPTY(nPrn)
Imprime(cFILE,80,nPrn)
ENDIF
ENDIF
RETURN NIL
*********************************************
Function Imprime( cArq, tamrel ,cPrinter )
*********************************************
local cTexto, nLinhas, nA, cLinha // oPrinter := win32prn():New(cPrinter)
local oPrinter := win32prn():New(cPrinter)
oPrinter:Landscape := .F.
oPrinter:FormType := 9
oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies := 1
IF FILE("res\logo.bmp") // se tiver o arquivo logo.bmp dentro da mesma pasta ele vai imprimir o logo primeiro
aTamlog := 9
else
aTamlog := 0
Endif
*cFILE2=SubStr( cArq, 1, 9 )
GERAFILE()
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate(cFILE, vARQ,"DBFCDX")
SELE 40
USE (cFILE) new shar VIA "DBFCDX"
append from (cArq) sdf && nome completo do arquivo sdf
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 SAGI")
MsgStop("ATENÇÃO !!! Não foi possivel Iniciar a Impressão, Favor Verificar o Spoll da Impressora","Aviso do Sistema")
Return NIL
endif
PrintBitMap( oPrinter )
FOR TT=1 TO aTamlog
oPrinter:newline()
NEXT
IF TAMREL=80
oPrinter:setfont('Courier New',,11,,,,255) // Normal
ELSE
oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
ENDIF
oPrinter:Bold(0) // Normal
dbgotop()
Do while !eof()
cLinha := Linha // Busca linha de impressao
oPrinter:newline() // Inicia nova linha
oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
oPrinter:TextOut(HB_OemToAnsi(cLinha))
oPrinter:Bold(0) // Normal
dbskip()
if !eof()
if (oPrinter:MaxRow() - 2) <= oPrinter:Prow() // Usa "oPrinter:NewPage()" para iniciar nova pagina
oPrinter:NewPage()
PrintBitMap( oPrinter )
FOR TT=1 TO aTamlog
oPrinter:newline()
NEXT
endif
endif
enddo
oPrinter:EndDoc()
oPrinter:Destroy()
ENDIF
USE
RETURN NIL
************************
FUNC PrintBitMap( oPrn ) //função para imprimir imagem do logotipo
************************
LOCAL oBMP
oBMP:= Win32BMP():new()
oBmp:loadFile( "res\logo.bmp" )
oBmp:Draw( oPrn, { 200,200,500,500 } )
oBMP:Destroy()
RETURN
****************
FUNCTION topodoc
****************
sendMessage(oEDiT:Handle, WM_VSCROLL ,SB_TOP,0)
sendMessage(oEDiT:Handle, EM_SETSEL ,0,0)
return .t.
*****************************
FUNCTION ZOOMIMP2(oedt,csize)
*****************************
nsizefont := nsizefont + iif(csize='-', 1 , -1)
nsizefont := iif(csize='-',min(-9,nsizefont),;
max(-15,nsizefont))
oFont2 := HFont():Add( "Courier New",0,nsizefont )
sendMessage(oEDiT:Handle,WM_SETFONT ,oFont2:handle,0 )
oEdIT:refresh()
RETURN .T.
*******************
FUNC GERA_PDF(cARQ)
*******************
Private AMSG, CIMG
PRIVATE oDlgHabla:=NIL
AMSG := {}
set(105,1)
set(106,1)
MsgRun("Aguarde Gerando Documento PDF...")
GERAFILE()
cFILE3 := cFILE+".PDF"
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate(cFILE, vARQ,"DBFCDX")
vAUTOR=ALLTRIM(xemp)
SELE 40
USE (cFILE) new shar VIA "DBFCDX"// ALIAS tela shared NEW
append from (cARQ) sdf && nome completo do arquivo sdf
PdfNew(cFile3,8,842,595,1,1,,,{vAUTOR,vAUTOR,vAUTOR,vAUTOR,vAUTOR})
PdfStartPage( {vAUTOR} , .T. )
//CIMG := "res\logo.bmp"
//PDFPLACEIMAGE(CIMG, 1,1,57.73,0.8166,1240,1754) // função pra incluir imagem
dbgotop()
cCONT=0
Do while !eof()
cLinha := Linha // Busca linha de impressao
cCONT=cCONT+1
Aadd(AMSG,cLinha)
IF cCONT=60
PdfDrawPage( AMSG )
PdfEndPage()
PdfStartPage( {""} , .T. )
cCONT=0
ENDIF
dbskip()
enddo
PdfDrawPage( AMSG )
PdfEndPage()
PdfEnd()
IF oDlgHabla#NIL
oDlgHabla:CLOSE()
ENDIF
Abre_aqrquivo( cFile3 )
return nil
#define CRLF Chr( 13 ) + Chr( 10 )
*****************************
PROCEDURE Abre_word(cARQ,IMP)
*****************************
LOCAL oWord, oText
PRIVATE oDlgHabla:=NIL
IF IMP=Nil
IMP="N"
endif
MsgRun("Aguarde Gerando Documento de Word...")
GERAFILE()
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate(cFILE, vARQ,"DBFCDX")
SELE 999
USE (cFILE) alias gera_ole EXCL new VIA "DBFCDX"// ALIAS tela shared NEW
append from (cARQ) sdf && nome completo do arquivo sdf
TRY
oWord := GetActiveObject( "Word.Application" )
CATCH
TRY
oWord := CreateObject( "Word.Application" )
CATCH
MsgStop("Não foi Possivel Achar o Word Instalado","Aviso do Sistema")
IF oDlgHabla#NIL
oDlgHabla:CLOSE()
ENDIF
RETURN
END
END
IF !FILE(cARQ)
MsgStop("Não Foi possivel Abrir o Documento de Word")
IF oDlgHabla#NIL
oDlgHabla:CLOSE()
ENDIF
RETURN
ENDIF
oWord:Documents:Add()
oText := oWord:Selection()
Sele gera_ole
dbgotop()
Do while !eof()
cLinha := Linha // Busca linha de impressao
oText:Font:Name := "Lucida Console"
oText:Font:Size := 8
oText:Font:Bold := .F.
oText:Text+= cLinha + CRLF
dbskip()
enddo
IF IMP="N"
oWord:Visible := .T. //PARA VISUALIZAR OU NÃO ANTES
oWord:WindowState := 1 // Maximize
ENDIF
IF IMP="S"
oWord:Visible := .F. //PARA VISUALIZAR OU NÃO ANTES
oWord:PrintOut() //PARA IMPRIMIR DIRETO
ENDIF
IF oDlgHabla#NIL
oDlgHabla:CLOSE()
ENDIF
RETURN
*************************************************************
Ex 02, esse Proximo tmb. pega de um TXT e mostra no proprio Preview() da HPRINTER
*************************************************************
Código: Selecionar todos
****************
Func Edicao(cARQ)
****************
Local i
LOCAL cPrinter := GetDefaultPrinter()
Private oWinPrn := NIL
cARQ:=alltrim( cARQ)
frename(cARQ,cARQ+".old")
regenfile(cARQ+".old",cARQ)
GERAFILE()
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate(cFILE, vARQ,"DBFCDX")
SELE 40
USE (cFILE) alias preview_dbf excl VIA "DBFCDX" // ALIAS tela shared NEW
append from (cArq) sdf
oWinPrn := HWinPrn():New( ,"RU866","RU1251" )
oWinPrn:StartDoc( .T. )
oWinPrn:PrintLine()
oWinPrn:SetMode( .F.,.T. )
cCONT=0
dbgotop()
Do while !eof()
cLinha := Linha // Busca linha de impressao
cCONT=cCONT+1
oWinPrn:PrintLine(HB_OemToAnsi(cLinha)
dbskip()
Enddo
oWinPrn:End()
sele preview_dbf
use
Return Nil
*************************************************************
Bom concerteza dah pra melhor todos os dois, mas ai fica a critério de cada um....
Abraços
Leonardo Machado