´
O objetivo da função é um preview de relatório, nesta função tem uma função busca_texto que destaca o texto encontrado em vermelho.
A divisão do preview é por página(s).
Se alguém precisar dos icones e avi me informem.
Aceito criticas se não estiver bom.
[]s
*----------------------------------------------------------------------------*
* Programa____: VIEWREPORT.PRG *
* *
* Linguagem___: Harbour *
* *
* LIB Gráfica_: HWGUI *
* *
* Programador_: Alexandre Simões *
* *
* Data________: 2013/08 *
*----------------------------------------------------------------------------*
* Atualizações: *
*----------------------------------------------------------------------------*
* Procedures__: *
* Funções_____: ViewReport(cArq) *
* TopoDoc() *
* ImprimeRaw(cArqImp) *
* ZoomRep(oEdt,cSize) *
* Busca_Texto(oEdit) *
* PaginaInicio(aTexto, oDlgReport) *
* PaginaFim(aTexto, oDlgReport ) *
* PaginaAnterior( nPage, aTexto, oDlgReport ) *
* PaginaSeguinte(oPage, nPage, aTexto, oDlgReport ) *
* Status(This,aTexto) *
* TopoDoc() *
* ZoomRep(oEdt,cSize,oDlgReport) *
* RichEditProc( oEdit, Msg, wParam, lParam ) *
* MsgGet( cTitle, cText, nStyle, x, y, nDlgStyle, cResIni ) *
* Reformata(cTexto) *
*----------------------------------------------------------------------------*
* Objetivo____: Visualizar relatórios do tipo texto em janela gráfica gerados*
* pelo harbour. *
* Observações_: *
*----------------------------------------------------------------------------*
#include "windows.ch"
#include "hwgui.ch"
#include "common.ch"
#include "guilib.ch"
#define ID_TEXTO 300
#define IDC_STATUS 2001
FUNCTION ViewReport(cArq)
LOCAL oFont, oFont2
LOCAL cText :=FileStr(cArq)
LOCAL oIconSair :=HIcon():AddFile("P:\GERAL\HARBOUR\SAIR.ICO")
LOCAL oIconPrint :=HIcon():AddFile("P:\GERAL\HARBOUR\RELATORIO.ICO")
LOCAL oIconZoomIn :=HIcon():AddFile("P:\GERAL\HARBOUR\ZOOMIN.ICO")
LOCAL oIconZoomOut :=HIcon():AddFile("P:\GERAL\HARBOUR\ZOOMOUT.ICO")
LOCAL oIconSeguinte:=HIcon():AddFile("P:\GERAL\HARBOUR\ISEGUINTE.ICO")
LOCAL oIconAnterior:=HIcon():AddFile("P:\GERAL\HARBOUR\IANTERIOR.ICO")
LOCAL oIconPrimeiro:=HIcon():AddFile("P:\GERAL\HARBOUR\IPRIMEIRO.ICO")
LOCAL oIconUltimo :=HIcon():AddFile("P:\GERAL\HARBOUR\IULTIMO.ICO")
LOCAL oIconLupa :=HIcon():AddFile("P:\GERAL\HARBOUR\ILUPA.ICO")
LOCAL aTexto:={""}, nPage:=1, oPage:=1
LOCAL oDlg_Rel
PRIVATE oDlgReport, n_IniPos:=0, n_FimPos:=0
PRIVATE aBusca:={}
oDlg_Rel:=DlgWait( "Gerando o Relatório", "Aguarde...","PROCESS32_32.AVI")
//inkey(0)
FT_FUSE( cArq )
DO WHILE !FT_FEOF()
cLinha:=FT_FREADLN()
lEject:=(Chr(12) $ cLinha)
lEscape:=(Chr(27) $ cLinha)
cLinha:=StrTran( cLinha, Chr(12)) // Elimina caracter EJECT
cLinha:=Reformata(cLinha)
IF FT_FRECNO() = 1
IF Empty(cLinha) //.AND. lEscape
FT_FSKIP()
LOOP
ENDIF
ENDIF
aTexto[oPage]+=cLinha + Chr( 13 ) + Chr( 10 )
IF lEject
AADD(aTexto,"")
oPage++
ENDIF
FT_FSKIP()
ENDDO
FT_FUSE()
IF Empty(aTexto[oPage])
hb_ADel( aTexto, oPage, .T. )
oPage--
ENDIF
cText:=aTexto[ nPage ]
nSizeFont:=-13
PREPARE FONT oFont NAME "Arial" WIDTH 0 HEIGHT 0 WEIGHT -10
oFont2:=HFont():Add( "Courier New" ,0,-13, 0,,, )
SetToolTipBalloon(.T.)
oDlg_Rel:Close()
INIT DIALOG oDlgReport TITLE "Visualização do Relatório" ;
ICON oIconPrint ;
AT 0,0 SIZE nWIDTH-50,nHEIGHT-50 ;
CLIPPER;
FONT oFont ;
COLOR 15048208 ;
STYLE DS_CENTER + WS_SYSMENU + WS_VISIBLE ;
ON INIT {| oDlgReport | oDlgReport:nInitFocus:=btnSair}
//ON INIT {| oDlgReport | oDlgReport:nInitFocus:=btnSair,PaginaInicio(aTexto, oDlgReport)}
@ 127,019 RichEdit oEdit TEXT cText SIZE nWIDTH-192,nHEIGHT-130 ;
OF oDlgReport ID ID_TEXTO ;
COLOR 16711680 ;
BACKCOLOR 15724484 ;
STYLE WS_HSCROLL+WS_VSCROLL+ES_LEFT+ES_MULTILINE+ES_READONLY ;
ON GETFOCUS {|| TopoDoc()};
FONT oFont2 ;
ON OTHERMESSAGES {|This,m,wp,lp| richeditProc( this, m,wp, lp ) }
//oEdit:bOther := {|o,m,wp,lp|richeditProc(o,m,wp,lp)}
@ 006,020 BUTTONEX cmd1 ;
CAPTION " - Zoom" ;
ON CLICK { || ZoomRep(oEdit,'-',oDlgReport)} ;
SIZE 115, 40 ;
ICON oIconZoomOut:handle ;
TOOLTIP 'Clique aqui para diminuir.'
@ 006,070 BUTTONEX cmd2 ;
CAPTION " + Zoom" ;
ON CLICK { || ZoomRep(oEdit,'+',oDlgReport)} ;
SIZE 115, 40 ;
ICON oIconZoomIn:handle ;
TOOLTIP 'Clique aqui para ampliar.'
@ 006,120 BUTTONEX cmd3 ;
CAPTION "Primeira" ;
ON CLICK { || nPage:=PaginaInicio( aTexto, oDlgReport ) } ;
SIZE 115, 40 ;
ICON oIconPrimeiro:handle ;
TOOLTIP 'Clique aqui para ir para primeira página.'
@ 006,170 BUTTONEX cmd4 ;
CAPTION "Anterior" ;
ON CLICK { || nPage:= PaginaAnterior( nPage, aTexto, oDlgReport ) } ;
SIZE 115, 40 ;
ICON oIconAnterior:handle ;
TOOLTIP 'Clique aqui para ir para página anterior.'
@ 006,220 BUTTONEX cmd5 ;
CAPTION "Seguinte" ;
ON CLICK { || nPage:= PaginaSeguinte( oPage, nPage, aTexto, oDlgReport ) } ;
SIZE 115, 40 ;
ICON oIconSeguinte:handle ;
TOOLTIP 'Clique aqui para ir para página seguinte.'
@ 006,270 BUTTONEX cmd6 ;
CAPTION "Última" ;
ON CLICK { || nPage:=PaginaFim( aTexto, oDlgReport ) } ;
SIZE 115, 40 ;
ICON oIconUltimo:handle ;
TOOLTIP 'Clique aqui para ir para última página.'
@ 006,320 BUTTONEX cmd7 ;
CAPTION "&Busca" ;
ON CLICK { || Busca_Texto(oEdit,aTexto,oDlgReport)} ;
SIZE 115, 40 ;
ICON oIconLupa:handle ;
TOOLTIP 'Clique aqui localizar um texto.'
//ON CLICK { || FocoRichEdit(oEdit),Busca_Texto(oEdit,aTexto,oDlgReport)} ;
@ 006,370 BUTTONEX cmd8 ;
CAPTION "Imprimir" ;
ON CLICK { || IF(MsgYesNo("Confirma a impressão?","Atenção"),ImprimeRaw((cArq)),)} ;
SIZE 115, 40 ;
ICON oIconPrint:handle ;
FONT oFont ;
TOOLTIP 'Clique aqui para imprimir.'
@ 006,420 BUTTONEX btnSair ;
CAPTION "&Sair" ;
ON CLICK { || EndDialog()} ;
SIZE 115, 40 ;
ICON oIconSair:handle ;
TOOLTIP 'Clique aqui para sair.'
ADD STATUS oStatus TO oDlgReport PARTS 100,100,100,180,0 ON INIT {|This| Status(This,aTexto) }
oDlgReport:Activate() // Parâmetro .T. = NOMODAL, .F. ou () = MODAL
RETURN Nil
STATIC FUNCTION FocoRichEdit(oEdit)
oEdit:SetFocus()
SendMessage( oEdit:handle, EM_SETSEL, n_IniPos, n_FimPos )
RETUR Nil
STATIC FUNCTION Busca_Texto(oEdit,aTexto,oDlgReport)
LOCAL oDlg :=GetModalHandle()
LOCAL cBusca :=''
LOCAL nStartFind :=0
LOCAL lCase :=.F.
LOCAL nPos :=1
LOCAL I
LOCAL cRes
LOCAL nResulta :=0
cBusca:=MsgGet("Pesquisa de Texto","Informe o que deseja encontrar:")
FOR I:=1 TO Len(aTexto)
nSearch1:=AT(Upper(cBusca),Upper(aTexto[i]))
IF nSearch1 > 0
//nSearch2:=ASCAN(aBusca,{|a| a[1] == cBusca + Str(I) })
//IF nSearch2 = 0
// AADD(aBusca,{cBusca+Str(I),I})
//ENDIF
nResulta:=I
EXIT
ENDIF
hwg_doevents()
NEXT
IF nResulta > 0
cTexto:=aTexto[ nResulta ]
SetDlgItemText( oDlg, ID_TEXTO, HB_OEMTOANSI(cTexto) )
WriteStatus( oDlgReport,4,'Página: '+LTrim(Str(nResulta,6))+" de "+LTrim(Str(Len(aTexto),6)))
ENDIF
nPos:=RE_FindText(oEdit:handle, cBusca, nStartFind, lCase)
oEdit:SetColor(16711680)
DO WHILE (nPos:=RE_FindText(oEdit:handle, cBusca, nStartFind, lCase)) > 0
n_IniPos:=nPos
n_FimPos:=nPos+Len(cBusca)
oEdit:SetFocus()
SendMessage( oEdit:handle, EM_SETSEL, n_IniPos, n_FimPos )
re_SetCharFormat( oEdit:handle, { {n_IniPos+1,n_FimPos+1,,,,.T. }, { n_IniPos+1,n_FimPos+1,255,,,.T.,,.F. } } )
SendMessage(oEdit:handle, EM_SETSEL, -1, 0 )
nStartFind:=nPos+Len(cBusca)+1
ENDDO
IF nPos = 0 .AND. !Empty(cBusca)
MsgInfo('Não foi possÃvel encontrar o texto: '+cBusca+'.','Atenção')
ENDIF
RETURN .T.
STATIC FUNCTION PaginaInicio(aTexto, oDlgReport)
LOCAL oDlg:=GetModalHandle()
cTexto:=aTexto[ 1 ]
Setdlgitemtext( oDlg, ID_TEXTO, HB_OEMTOANSI(cTexto) )
WriteStatus( oDlgReport,4,'Página: '+LTrim(Str(1,6))+" de "+LTrim(Str(Len(aTexto),6)))
RETURN 1
STATIC FUNCTION PaginaFim(aTexto, oDlgReport )
LOCAL oDlg:=GetModalHandle(), nUltimaPag:=Len(aTexto)
cTexto:=aTexto[ nUltimaPag ]
IF Empty(cTexto)
cTexto:=""
ENDIF
Setdlgitemtext( oDlg, ID_TEXTO, HB_OEMTOANSI(cTexto) )
WriteStatus( oDlgReport,4,'Página: '+LTrim(Str(nUltimaPag,6))+" de "+LTrim(Str(nUltimaPag,6)))
RETURN nUltimaPag
STATIC FUNCTION PaginaAnterior( nPage, aTexto, oDlgReport )
LOCAL oDlg:=GetModalHandle()
nPage := -- nPage
IF nPage < 1 ; nPage := 1 ; ENDIF
cTexto:=aTexto[ nPage ]
Setdlgitemtext( oDlg, ID_TEXTO, HB_OEMTOANSI(cTexto) )
WriteStatus( oDlgReport,4,'Página: '+LTrim(Str(nPage,6))+" de "+LTrim(Str(Len(aTexto),6)))
RETURN nPage
STATIC FUNCTION PaginaSeguinte(oPage, nPage, aTexto, oDlgReport )
LOCAL oDlg:=GetModalHandle()
nPage := ++ nPage
IF nPage > oPage ; nPage := oPage ; ENDIF
cTexto:=aTexto[ nPage ]
IF Empty(cTexto)
cTexto:=""
ENDIF
Setdlgitemtext( oDlg, ID_TEXTO, HB_OEMTOANSI(cTexto) )
WriteStatus( oDlgReport,4,'Página: '+LTrim(Str(nPage,6))+" de "+LTrim(Str(Len(aTexto),6)))
RETURN nPage
STATIC FUNCTION Reformata(cTexto)
LOCAL cText:=cTexto
cText:=StrTran(cText,Chr(27)+"P"+Chr(15))
cText:=StrTran(cText,Chr(12),Chr(13)+Chr(13))
cText:=StrTran(cText,Chr(27)+"P")
cText:=StrTran(cText,Chr(27)+Chr(77)+Chr(15))
cText:=StrTran(cText,Chr(27)+Chr(77)+Chr(18))
cText:=StrTran(cText,Chr(27)+Chr(80)+Chr(18))
cText:=StrTran(cText,Chr(15))
cText:=StrTran(cText,Chr(18))
cText:=StrTran(cText,"%0A(s0p15h0s0b4102T")
cText:=StrTran(cText,"%0A(s0p10h0s0b4099T")
RETURN cText
STATIC FUNCTION Status(This,aTexto)
This:settextpanel(2,'Lin:'+Str(1,6))
This:settextpanel(3,'Col:'+Str(1,6))
This:settextpanel(4,'Página: '+LTrim(Str(1,6))+" de "+LTrim(Str(Len(aTexto),6)))
RETURN Nil
STATIC FUNCTION TopoDoc()
SendMessage(oEdit:Handle, WM_VSCROLL ,SB_TOP,0)
SendMessage(oEdit:Handle, EM_SETSEL ,0,0)
RETURN .T.
STATIC FUNCTION ZoomRep(oEdt,cSize,oDlgReport)
IF cSize='+' ; WriteStatus(oDlgReport,1,'+ Zoom'); ELSE ; WriteStatus(oDlgReport,1,''); ENDIF
nSizeFont+=nSizeFont + IIF(cSize='+', 1 , -1)
nSizeFont:=IIF(cSize='+',Min(-9,nSizeFont),Max(-13,nSizeFont))
oFont2:=HFont():Add( "Courier New",0,nSizeFont )
SendMessage(oEdit:Handle,WM_SETFONT ,oFont2:handle,0 )
oEdit:SetColor(16711680)
oEdit:Refresh()
RETURN .T.
STATIC FUNCTION RichEditProc( oEdit, Msg, wParam, lParam )
IF Msg == WM_KEYUP .OR. Msg == WM_KEYDOWN .OR. Msg == WM_LBUTTONDOWN .OR. Msg == WM_SYSKEYDOWN
nColuna:=Loword(SendMessage(oEdit:Handle, EM_GETSEL, 0, 0))
nLinha :=SendMessage(oEdit:Handle, EM_LINEFROMCHAR, nColuna, 0) + 1
nColuna:=nColuna - SendMessage(oEdit:Handle, EM_LINEINDEX, -1, 0) + 1
//
WriteStatus( oDlgReport,2,'Lin:'+Str(nLinha,6))
WriteStatus( oDlgReport,3,'Col:'+Str(nColuna,6))
oEdit:Refresh()
ENDIF
RETURN -1
STATIC FUNCTION MsgGet( cTitle, cText, nStyle, x, y, nDlgStyle, cResIni )
LOCAL oModDlg, oFont := HFont():Add( "MS Sans Serif", 0, - 13 )
LOCAL cRes := IIf( cResIni != Nil, Trim( cResIni ), "" )
LOCAL oIconOk :=HIcon():AddFile("P:\GERAL\HARBOUR\IOK.ICO")
LOCAL oIconCancela :=HIcon():AddFile("P:\GERAL\HARBOUR\ICANCELA.ICO")
nStyle := IIf( nStyle == Nil, 0, nStyle )
x := IIf( x == Nil, 210, x )
y := IIf( y == Nil, 10, y )
nDlgStyle := IIf( nDlgStyle == Nil, 0, nDlgStyle )
INIT DIALOG oModDlg TITLE cTitle At x, y SIZE 300, 140 ;
FONT oFont CLIPPER ;
STYLE DS_CENTER+ WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_SIZEBOX + nDlgStyle
@ 20, 10 SAY cText SIZE 260, 22
@ 20, 35 GET cRes SIZE 260, 26 STYLE WS_TABSTOP + ES_AUTOHSCROLL + nStyle
oModDlg:aControls[ 2 ]:Anchor := ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS
@ 20, 95 BUTTONEX "Ok" ID IDOK SIZE 115, 40 ICON oIconOk:handle TOOLTIP 'Clique aqui para iniciar a pesquisar.'
oModDlg:aControls[ 3 ]:Anchor := ANCHOR_BOTTOMABS
@ 168,95 BUTTONEX "Cancelar" ID IDCANCEL SIZE 115, 40 ICON oIconCancela:handle TOOLTIP 'Clique aqui para cancelar a pesquisa.'
oModDlg:aControls[ 4 ]:Anchor := ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS
ACTIVATE DIALOG oModDlg ON ACTIVATE { || IIF( ! Empty( cRes ), KEYB_EVENT( VK_END ), .T. ) }
oFont:Release()
IF oModDlg:lResult
RETURN Trim( cRes )
ELSE
cRes := ""
ENDIF
RETURN cRes
STATIC FUNCTION DlgWait( cTitle, cMensagem_Wait, cArqVideo )
LOCAL oDlg_Wait, oLabel_Wait
LOCAL oIconWait:=HIcon():AddFile("P:\GERAL\HARBOUR\IAMPULHETA.ICO")
LOCAL lAutoPlay:=.T., lCenter:=.T., lTransparent:=.T.
DEFAULT cArqVideo TO "P:\GERAL\HARBOUR\LOADER.AVI"
cRes:=""
INIT DIALOG oDlg_Wait TITLE cTitle ;
ICON oIconWait ;
AT 0,0 ;
SIZE 350,90 STYLE DS_CENTER + WS_SYSMENU //90
@ 10,10 ANIMATION SIZE 30, 30 AUTOPLAY CENTER TRANSPARENT FILE cArqVideo
@ 50,20 SAY oLabel_Wait CAPTION cMensagem_Wait SIZE 200,19
ACTIVATE DIALOG oDlg_wait NOMODAL
RETURN oDlg_Wait
FUNCTION AberturaAvi( cArqVideo, cTitle )
LOCAL oDlg_Wait, oCtrl, oWait
LOCAL lAutoPlay:=.T., lCenter:=.T., lTransparent:=.F.
DEFAULT cArqVideo TO "",;
cTitle TO ""
INIT DIALOG oDlg_Wait TITLE cTitle ;
AT 0,0 ;
CLIPPER;
SIZE 737,518 STYLE DS_CENTER + WS_VISIBLE
oCtrl:=HAnimation():New( oDlg_Wait, , , 5, 5, 720, 480, cArqVideo, lAutoPlay, lCenter, lTransparent )
oDlg_Wait:Activate()
RETURN oDlg_Wait
PROCEDURE Fim( oControl1,oControl2 )
oControl2:End()
oControl1:Close()
oControl1:Destroy()
EndDialog()
RETURN
STATIC FUNCTION ImprimeRaw(cArqImp)
LOCAL cMsg:="", nRet, cPrinter:=WIN_PrinterGetDefault(), oDlg_Rel
oDlg_Rel:=DlgWait( "Imprimindo o Relatório", "Aguarde...", "P:\GERAL\HARBOUR\IMPRESSORA.AVI" )
nRet:=WIN_PrintFileRaw(cPrinter,cArqImp,'REPORT_PREVIEW')
oDlg_Rel:Close()
RETURN Nil