Jump to content
Fivewin Brasil

syspel

Membros
  • Posts

    511
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by syspel

  1. obrigado pela a ideia

    ,mais tem 1 pedido digitado como eu faco para usar a classe do gilmer

    onde eu coloco o numero do pedido nome do clientes,produto etc ?

    suporte@syspel.com.br

    carlos

    fwh14.04 xhar 123 dbf xdev

     

     

  2. obrigado pela a ideia

    ,mais tem 1 pedido digitado como eu faco para usar a classe do gilmer

    onde eu coloco o numero do pedido nome do clientes,produto etc ?

    suporte@syspel.com.br

    carlos

    fwh14.04 xhar 123 dbf xdev

     

     

  3. o dono da syspel e o gilberto,eu so o ultimo que fala e o primeiro que apanha 

    mais consegui fazer um exerto eu acho que ficou bom, so falta para o excell fazer fiquei sem saco

    vou anexar a dll e o rpreview foi uma semana de tampo, para mim ja esta bom

    obrigado a todos

    vou color se eu consequi anexar

     

  4. Alguém consegue corrigir a impressão na tela desse RPREVIEW, ele mostra distorcido na tela, mas imprime corretamente.

     

    #include "FiveWin.ch"
    #include "mail.ch"

    #ifdef __XHARBOUR__
       #xtranslate HB_CurDrive()  => CurDrive()
       #xtranslate HB_TTOS( <t> ) => TTOS( <t> )
       #xtranslate HB_DateTime()  => DateTime()
    #endif

    #define DEVICE      oWnd:cargo

    #define GO_POS      0
    #define GO_UP       1
    #define GO_DOWN     2
    #define GO_LEFT     1
    #define GO_RIGHT    2
    #define GO_PAGE    .T.

    #define VSCROLL_RANGE  20 * ::nZFactor
    #define HSCROLL_RANGE  20 * ::nZFactor

    #define TXT_FIRST     LoadString( GetResources(), 07 )
    #define TXT_PREVIOUS LoadString( GetResources(), 08 )
    #define TXT_NEXT     LoadString( GetResources(), 09 )
    #define TXT_LAST     LoadString( GetResources(), 10 )
    #define TXT_ZOOM     LoadString( GetResources(), 11 )
    #define TXT_UNZOOM   LoadString( GetResources(), 12 )
    #define TXT_TWOPAGES LoadString( GetResources(), 13 )
    #define TXT_ONEPAGE  LoadString( GetResources(), 14 )
    #define TXT_PRINT    LoadString( GetResources(), 15 )
    #define TXT_EXIT     LoadString( GetResources(), 16 )
    #define TXT_FILE     LoadString( GetResources(), 17 )
    #define TXT_PAGE     LoadString( GetResources(), 18 )
    #define TXT_PREVIEW  LoadString( GetResources(), 03 )
    #define TXT_PAGENUM  LoadString( GetResources(), 19 )

    #define TXT_A_WINDOW_PREVIEW_IS_ALLREADY_RUNNING ;
            LoadString( GetResources(), 20 )
    #define TXT_GOTO_FIRST_PAGE ;
            LoadString( GetResources(), 21 )
    #define TXT_GOTO_PREVIOUS_PAGE ;
            LoadString( GetResources(), 22 )
    #define TXT_GOTO_NEXT_PAGE ;
            LoadString( GetResources(), 23 )
    #define TXT_GOTO_LAST_PAGE ;
            LoadString( GetResources(), 24 )
    #define TXT_ZOOM_THE_PREVIEW ;
            LoadString( GetResources(), 25 )
    #define TXT_UNZOOM_THE_PREVIEW ;
            LoadString( GetResources(), 26 )
    #define TXT_PREVIEW_ON_TWO_PAGES ;
            LoadString( GetResources(), 27 )
    #define TXT_PREVIEW_ON_ONE_PAGE ;
            LoadString( GetResources(), 28 )
    #define TXT_PRINT_CURRENT_PAGE ;
            LoadString( GetResources(), 29 )
    #define TXT_EXIT_PREVIEW ;
            LoadString( GetResources(), 30 )
    #define TXT_FACTOR ;
            LoadString( GetResources(), 31 )
    #define TXT_ZOOM_FACTOR ;
            LoadString( GetResources(), 32 )

    #define TXT_EXPORT_MSWORD ;
            LoadString( GetResources(), 33 )

    #define MK_MBUTTON            16

    static bUserBtns, lRebar, nBtnW, nBtnH, nStyle
    static lWord, lCalc

    //----------------------------------------------------------------------------//

    CLASS TPreview

       DATA   oWnd, oBar, oFont, oImageList
       DATA   oDevice, oReport
       DATA   oHand, oCursor
       DATA   oMeta1, oMeta2, oSay, oFactor
       DATA   oPage, oTwoPages, oZoom
       DATA   oMenuZoom, oMenuTwoPages, oMenuUnZoom, oMenuOnePage
       DATA   cResFile
       DATA   aFactor, nPage, nZFactor
       DATA   lTwoPages, lZoom, lExit
       DATA   cPageNum

       DATA   hOldRes, hNewRes
       DATA   oLvw, oImageListPages

       CLASSDATA cResFile
       CLASSDATA oWndMain
       CLASSDATA bPrint, bExportToWord, bSaveAsWord, bSaveAsPDF, bEmail

       CLASSDATA lListViewHide INIT .F.

       METHOD New( oDevice, oReport )
       METHOD Activate()
       METHOD BuildButtonBar()
       METHOD BuildListView() // mini pages viewer
       METHOD BuildWindow()
       METHOD BuildMenu()
       METHOD GoPage( nPage )
       METHOD PaintMeta()
       METHOD PrintersMenu()
       METHOD NextPage()
       METHOD PrevPage()
       METHOD TopPage()
       METHOD BottomPage()
       METHOD TwoPages( lMenu )
       METHOD Zoom( lMenu )
       METHOD VScroll( nType, lPage, nSteps )
       METHOD HScroll( nType, lPage, nSteps )
       METHOD SetOrg1( nX, nY )
       METHOD SetOrg2( nX, nY )
       METHOD CheckKey( nKey, nFlags )
       METHOD CheckMouseWheel( nKeys, nDelta, nXPos, nYPos )
       METHOD SelPrinter( cPrinter )
       METHOD SetFactor( nValue )
       METHOD PrintPage()
       METHOD PrintPrv( oDlg, nOption, nPageIni, nPageEnd )

       ACCESS CanExportToWord  INLINE ::bExportToWord != nil .or. lWord != .f. .or. lCalc != .f.
       ACCESS CanExportToExcel INLINE ( ::oReport != nil .and. ;
                                      ( ::oReport:bInit != nil .or. ::oReport:bToExcel != nil ) )
       METHOD ExportToMSWord()


       METHOD ExportToMSExcel() INLINE If( ::CanExportToExcel, ::oReport:ToExcel(), ;
                                MsgInfo( FWString( "Export to Excel is available only" ) + ;
                                CRLF + ;
                                FWString( "for Reports with ::bInit defined" ), FWString( "Information" ) ) )

       METHOD SaveAsMenu()
       METHOD SaveAs( lPDF )
       METHOD SendEmail()

       METHOD CheckStyle() PROTECTED
       METHOD ResizeListView()

    ENDCLASS

    //----------------------------------------------------------------------------//

    METHOD New( oDevice, oReport ) CLASS TPreview

       if oDevice == nil
          PRINTER oDevice PREVIEW
             PAGE
             ENDPAGE
             // MsgInfo( oDevice:aMeta[ 1 ] )
          // ENDPRINTER
       endif

       ::oDevice   := oDevice
       ::oReport   := oReport
       ::nPage     := 1
       ::nZFactor  := 1
       ::lTwoPages := .F.
       ::lZoom       := .F.
       ::lExit     := .F.

       ::BuildWindow()

    return Self

    //----------------------------------------------------------------------------//

    METHOD Activate() CLASS TPreview

       local hWndMain

       if ::oWnd == nil
          return nil
       endif

       ACTIVATE WINDOW ::oWnd MAXIMIZED ;
          ON RESIZE    ( ::PaintMeta(), ::ResizeListView() ) ;
          ON UP        ::VScroll( GO_UP )             ;
          ON DOWN      ::VScroll( GO_DOWN )           ;
          ON PAGEUP    ::VScroll( GO_UP, GO_PAGE)     ;
          ON PAGEDOWN  ::VScroll( GO_DOWN, GO_PAGE)   ;
          ON LEFT      ::HScroll( GO_LEFT )           ;
          ON RIGHT     ::HScroll( GO_RIGHT )          ;
          ON PAGELEFT  ::HScroll( GO_LEFT, GO_PAGE )  ;
          ON PAGERIGHT ::HScroll( GO_RIGHT, GO_PAGE ) ;
          VALID        ( ::oWnd:oIcon := nil       ,;
                         ::oFont:End()             ,;
                         ::oMeta1:End()            ,;
                         ::oMeta2:End()            ,;
                         ::oDevice:End()           ,;
                         ::oHand:End()             ,;
                         If( Empty( ::oImageList ),, ( ::oImageList:End(), ::oImageList := nil ) ),;
                         If( ! Empty( ::oImageListPages ), ::oImageListPages:End(),),;
                         ::oWnd := nil             ,;
                         ::oDevice:oPreview := nil ,;
                         ::lExit := .T. )

         if ::oDevice:lPrvModal
             if ::oWndMain == nil
                StopUntil( { || ::lExit } )
             else
    //            StopUntil( { || ::lExit .or. !IsWindow( WndMain():hWnd ) } ) // errors our when WndMain() becomes nil
                hWndMain    := WndMain():hWnd
                StopUntil( { || ::lExit .or. !IsWindow( hWndMain ) } )
             endif
         endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD BuildButtonBar() CLASS TPreview

       local oImageList, oReBar, oBar, oHand, uRet, oBtn

       DEFINE CURSOR ::oHand HAND

       if lRebar
          DEFINE IMAGELIST oImageList SIZE 16, 16

          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "top2" ) ),      nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "previous2" ) ), nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "next2" ) ),     nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "bottom2" ) ),   nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "zoom2" ) ),     nRGB( 255,   0, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "twopages2" ) ), nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "printer" ) ),   nRGB( 255,   0, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "save" ) ),      nRGB( 255,   0, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "pdf" ) ),       nRGB( 255,   0, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "email" ) ),     nRGB( 255, 255, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "word2" ) ),     nRGB( 255,   0, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "excel" ) ),     nRGB( 255,   0, 255 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "exit2" ) ),     nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "onepage2" ) ),  nRGB( 192, 192, 192 ) )
          oImageList:AddMasked( TBitmap():Define( ,,, FWBitmap( "onepage2" ) ),  nRGB( 192, 192, 192 ) )
          ::oImageList = oImageList

          oReBar = TReBar():New( ::oWnd )

          DEFINE TOOLBAR oBar OF oReBar SIZE 25, 25 IMAGELIST oImageList

          ::oBar = oBar
          oReBar:InsertBand( oBar )

          oBar:nHeight -= 2

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::TopPage() ;
             TOOLTIP FWString( "First" ) ;
             MESSAGE FWString( "Go to first page" )

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::PrevPage() ;
             TOOLTIP FWString( "Previous" ) ;
             MESSAGE FWString( "Go to previous page" )

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::NextPage() ;
             TOOLTIP FWString( "Next" ) ;
             MESSAGE FWString( "Go to next page" )

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::BottomPage() ;
             TOOLTIP FWString( "Last" ) ;
             MESSAGE FWString( "Go to last page" )

          DEFINE TBSEPARATOR OF oBar

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::Zoom() ;
             TOOLTIP FWString( "Zoom" ) ;
             MESSAGE FWString( "Page zoom" )

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::TwoPages() ;
             TOOLTIP FWString( "Two pages" ) ;
             MESSAGE FWString( "Preview on two pages" )

          DEFINE TBSEPARATOR OF oBar

          DEFINE TBMENU OF oBar ;
             ACTION  If( ValType( ::bPrint ) == 'B', Eval( ::bPrint, Self ), ::PrintPage() ) ;
             TOOLTIP FWString( "Print" ) ;
             MESSAGE FWString( "Print actual page" ) ;
             MENU    ::PrintersMenu()

          DEFINE TBMENU OF oBar ;
             ACTION  ::SaveAs( .f. ) ;
             TOOLTIP FWString( "Save as" ) ;
             MESSAGE FWString( "Save to DOC/PDF" ) ;
             MENU ::SaveAsMenu()

         DEFINE TBBUTTON OF oBar ;
            ACTION ::SaveAs( .t. ) ; //If( ::bSaveAsPDF == nil, FWSavePreviewToPDF( Self ), Eval( ::bSaveAsPDF, Self ) ) ;
            TOOLTIP FWString( "Export to PDF" ) ;
            MESSAGE FWString( "Export to PDF" )

         DEFINE TBBUTTON OF oBar ;
            ACTION ::SendEmail() ;
            TOOLTIP FWString( "Send by email as PDF" ) ;
            MESSAGE FWString( "Send by email as PDF" )

         DEFINE TBBUTTON OF oBar ;
            ACTION ::ExportToMSWord() ;
            TOOLTIP FWString( "Export to MS Word" ) ;
            MESSAGE FWString( "Export to MS Word" )

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::ExportToMSExcel() ;
             TOOLTIP FWString( "Export to Excel" ) ;
             MESSAGE FWString( "Export to Excel" ) ;
             WHEN ::CanExportToExcel

          DEFINE TBSEPARATOR OF oBar

          DEFINE TBBUTTON OF oBar ;
             ACTION  ::oWnd:End() ;
             TOOLTIP FWString( "Exit" ) ;
             MESSAGE FWString( "Exit from preview" )

       else
          if nStyle == 2010
             DEFINE BUTTONBAR oBar OF ::oWnd 2010 ;
                SIZE IfNil( nBtnW, 26 ), IfNil( nBtnH, If( LargeFonts(), 30, 26 ) )
          else
             DEFINE BUTTONBAR oBar OF ::oWnd ;
                SIZE IfNil( nBtnW, 26 ), IfNil( nBtnH, If( LargeFonts(), 30, 26 ) )
          endif
          ::oBar = oBar
          oBar:l2007     := ( nStyle == 2007 )
          oBar:l2010     := ( nStyle == 2010 )
          oBar:l97Look   := ( nStyle == 97 )
          oBar:bRClicked := { || nil }  // to retain the bar on top only

          DEFINE BUTTON oBtn OF oBar ;
             MESSAGE FWString( "Go to first page" ) ;
             ACTION  ::TopPage() ;
             TOOLTIP FWString( "First" )

          oBtn:hBitmap1 = FWBitmap( "top2" )

          DEFINE BUTTON oBtn OF oBar ;
             MESSAGE FWString( "Go to previous page" ) ;
             ACTION  ::PrevPage() ;
             TOOLTIP FWString( "Previous" )

          oBtn:hBitmap1 = FWBitmap( "previous2" )

          DEFINE BUTTON oBtn OF oBar ;
             MESSAGE FWString( "Go to next page" ) ;
             ACTION  ::NextPage() ;
             TOOLTIP FWString( "Next" )

          oBtn:hBitmap1 = FWBitmap( "Next2" )

          DEFINE BUTTON oBtn OF oBar ;
             MESSAGE FWString( "Go to last page" ) ;
             ACTION  ::BottomPage() ;
             TOOLTIP FWString( "Last" )

          oBtn:hBitmap1 = FWBitmap( "Bottom2" )

          DEFINE BUTTON ::oZoom OF oBar GROUP ;
             MESSAGE FWString( "Page zoom" ) ;
             ACTION  ::Zoom() ;
             TOOLTIP FWString( "Zoom" )

          ::oZoom:hBitmap1 = FWBitmap( "Zoom2" )

          DEFINE BUTTON ::oTwoPages OF oBar ;
             MESSAGE FWString( "Preview on two pages" ) ;
             ACTION  ::TwoPages() ;
             TOOLTIP FWString( "Two pages" )

          ::oTwoPages:hBitmap1 = FWBitmap( "TwoPages2" )

          DEFINE BUTTON oBtn OF oBar GROUP ;
             MENU    ::PrintersMenu() ;
             MESSAGE FWString( "Print actual page" )            ;
             ACTION  If( ValType( ::bPrint ) == 'B', Eval( ::bPrint, Self ), ::PrintPage() ) ;
             TOOLTIP FWString( "Print" )

          oBtn:hBitmap1 = FWBitmap( "Printer" )

          if ! Empty( bUserBtns )
             uRet = Eval( bUserBtns, Self, oBar )
          endif

          if ! ( ValType( uRet ) == 'L' .and. uRet == .f. )

             DEFINE BUTTON oBtn OF oBar ;
                MENU ::SaveAsMenu() ;
                MESSAGE FWString( "Save to DOC/PDF" ) ;
                ACTION This:ShowPopUp() ;
                TOOLTIP FWString( "Save to DOC/PDF" )

             oBtn:hBitmap1 = FWBitmap( "Save" )

             DEFINE BUTTON oBtn OF oBar ;
                MESSAGE FWString( "Export to PDF" ) ;
                ACTION  ::SaveAs( .t. ) ;
                TOOLTIP FWString( "Export to PDF" )

             oBtn:hBitmap1 = FWBitmap( "PDF" )

             DEFINE BUTTON oBtn OF oBar ;
                MESSAGE FWString( "Send by email as PDF" ) ;
                ACTION  ::SendEmail() ;
                TOOLTIP FWString( "Send by email as PDF" )

             oBtn:hBitmap1 = FWBitmap( "email" )

             DEFINE BUTTON oBtn OF oBar ;
                MESSAGE FWString( "Export to MS Word" ) ;
                ACTION  ::ExportToMSWord() ;
                TOOLTIP FWString( "Export to MS Word" ) ;
                WHEN ::CanExportToWord

             oBtn:hBitmap1 = FWBitmap( "Word2" )

             DEFINE BUTTON oBtn OF oBar ;
                MESSAGE FWString( "Export to Excel" ) ;
                ACTION ::ExportToMSExcel() ;
                TOOLTIP FWString( "Export to Excel" ) ;
                WHEN ::CanExportToExcel

             oBtn:hBitmap1 = FWBitmap( "Excel" )

          endif

          DEFINE BUTTON oBtn OF oBar GROUP ;
             MESSAGE FWString( "Exit from preview" )               ;
             ACTION  ::oWnd:End()                   ;
             TOOLTIP FWString( "Exit" )

          oBtn:hBitmap1 = FWBitmap( "Exit2" )

          AEval( oBar:aControls, { | o | o:oCursor := ::oHand } )

       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD BuildWindow() CLASS TPreview

       local oIcon, cTitle := FWString( "Printing Preview" )
       local oCursor, oBar, nCol := 325
       local oThis := Self, nRow := 7

       if Len( ::oDevice:aMeta ) < 1
          return nil
       endif

        DEFAULT ::oWndMain := WndMain()

       ::hNewRes      := GetResources()

     if ! File( ::cResFile )

          #ifdef __CLIPPER__
             ::cResFile := "Preview.dll"
          #else
             if ! IsWin64()
                ::cResFile := "Prev32.dll"
             else
                ::cResFile = "Prev64.dll"
             endif
          #endif

       endif

       if SetResources( ::cResFile ) < 32
          MsgStop( ::cResFile + " not found, imposible to continue",;
                   "FiveWin Printing Error" )
          return nil
       endif

       if ::oDevice != nil
          cTitle = ::oDevice:cDocument
       endif

       if ::oWndMain != nil
          oIcon = ::oWndMain:oIcon
       else
          DEFINE ICON oIcon RESOURCE "Print"
       endif

       DEFINE FONT ::oFont NAME GetSysFont() SIZE 0, -12

       ::CheckStyle()

       if ! ::oDevice:lPrvModal .and. ::oWndMain != nil .and. ;
          Upper( ::oWndMain:ClassName() ) == "TMDIFRAME"
          DEFINE WINDOW ::oWnd ;
             TITLE cTitle ;
             COLOR CLR_BLACK,CLR_LIGHTGRAY ;
             ICON  oIcon ;
             VSCROLL HSCROLL MDICHILD
       else
          DEFINE WINDOW ::oWnd ;
             TITLE cTitle ;
             COLOR CLR_BLACK,CLR_LIGHTGRAY ;
             ICON  oIcon ;
             VSCROLL HSCROLL MENU ::BuildMenu()
       endif

       ::oWnd:SetFont( ::oFont )

       ::oWnd:oVScroll:SetRange( 0, 0 )
       ::oWnd:oHScroll:SetRange( 0, 0 )

       ::cPageNum = FWString( "Page number:" )
       ::BuildButtonBar()

       if lRebar
          DEFINE STATUSBAR OF ::oWnd PROMPT "  " + FWString( "Preview" )
       else
          SET MESSAGE OF ::oWnd TO FWString( "Preview" ) CENTERED ;
             NOINSET CLOCK DATE KEYBOARD
          ::oWnd:oMsgBar:l2007    := ( nStyle == 2007 )
          ::oWnd:oMsgBar:l2010    := ( nStyle == 2010 )
       endif

       // We build the left thumbs listview
       if ! ::lListViewHide
          ::BuildListView()
       endif

       // We build the main metafiles to display the pages

       ::oMeta1 := TMetaFile():New( 0, 0, 0, 0,;
                                    ::oDevice:aMeta[ 1 ],;
                                    ::oWnd,;
                                    CLR_BLACK,;
                                    CLR_WHITE,;
                                    ::oDevice:nHorzRes(),;
                                    ::oDevice:nVertRes() )

       DEFINE CURSOR ::oCursor SEARCH

       ::oMeta1:oCursor := ::oCursor
       ::oMeta1:blDblClick := { | nRow, nCol, nKeyFlags | ;
                                ::SetOrg1( nCol, nRow, nKeyFlags ) }

       ::oMeta1:bKeyDown := { | nKey, nFlags | ::CheckKey( nKey, nFlags ) }
       ::oMeta1:bMouseWheel := { | nKeys, nDelta, nXPos, nYPos | ;
                                 ::CheckMouseWheel( nKeys, nDelta, nXPos, nYPos ) }

       ::oMeta2 := TMetaFile():New( 0, 0, 0, 0, "",;
                                    ::oWnd, CLR_BLACK, CLR_WHITE, ::oDevice:nHorzRes(),;
                                    ::oDevice:nVertRes() )

       ::oMeta2:oCursor = ::oCursor
       ::oMeta2:blDblClick := { | nRow, nCol, nKeyFlags | ;
                                ::SetOrg2( nCol, nRow, nKeyFlags ) }

       ::oMeta2:hide()

       ::SetFactor()

       oBar     := ::oBar

       if .T. // ! lRebar
          nCol  := If( ! Empty( oBar:aControls ), ATail( oBar:aControls ):nRight, Len( oBar:aButtons ) * ( oBar:nBtnWidth + 2 ) ) + 30
          nRow    := Int( oBar:nHeight / 2 ) - 6
       endif

       if nStyle >= 2007
          oBar:bPainted = { || oBar:Say( nRow, nCol, "Factor:",,, ::oFont, .T., .T. ),;
                               oBar:Say( nRow, nCol+100, ::cPageNum + " " + ;
                               LTrim( Str( ::nPage, 4, 0 ) ) + " / " + ;
                               LTrim( Str( Len( ::oDevice:aMeta ) ) ),,, ::oFont, .T., .T. ) }

       endif

       if nStyle < 2007
          @ nRow, nCol SAY ::oSay PROMPT "Factor:" ;
             SIZE 45, 15 PIXEL OF ::oBar FONT ::oFont

          ::oSay:lTransparent = .T.
       endif

       @ nRow - 4, nCol + 40 COMBOBOX ::oFactor VAR ::nZFactor ;
          ITEMS { "1", "2", "3", "4", "5", "6", "7", "8", "9" } ;
          OF ::oBar FONT ::oFont PIXEL SIZE 35,200 ;
          ON CHANGE oThis:SetFactor( oThis:nZFactor )

       if nStyle < 2007
          @ nRow, nCol + 100 SAY ::oPage PROMPT FWString( "Page number:" ) + ;
            LTrim( Str( ::nPage, 4, 0 ) ) + " / " + ;
            LTrim( Str( Len( ::oDevice:aMeta ) ) ) ;
            SIZE 180, 15 PIXEL OF ::oBar FONT ::oFont
          ::oPage:lTransparent = .T.
       endif

       if lRebar .or. nStyle >= 2007
          #define NULL_BRUSH 5
          FixSays( ::oBar:hWnd, GetStockObject( NULL_BRUSH ) )
       endif

       ::oFactor:Set3dLook( .T. )

       ::oWnd:oHScroll:bPos := { | nPos | ::HScroll( GO_POS, .f., nPos ) }
       ::oWnd:oVScroll:bPos := { | nPos | ::VScroll( GO_POS, .f., nPos ) }

    return nil

    //----------------------------------------------------------------------------//

    METHOD BuildListView() CLASS TPreview

       local nSizeH, nSizeV, oBmp, n, aPrompts := {}

       if ::oDevice:nHorzRes() > ::oDevice:nVertRes()
         nSizeH = 100
         nSizeV = 80
       else
         nSizeH = 80
         nSizeV = 100
       endif

       oBmp = TBitmap():Define()
       ::oImageListPages = TImageList():New( nSizeH, nSizeV )

       for n := 1 to Len( ::oDevice:aMeta )
          oBmp:hBitmap := PageBitmap( ::oDevice:aMeta[ n ], nSizeH, nSizeV )
          ::oImageListPages:Add( oBmp )
          Aadd( aPrompts, AllTrim( Str( n ) ) )
       NEXT

       ::oLvw = TListView():New( 33 - If( ::oWnd:oTop:IsKindOf( "TBAR" ), 6, 0 ),;
                                 0, aPrompts, { | nPage | ::GoPage( nPage ) }, ::oWnd,;
                                 ,, .T.,, nSizeH + 45, ScreenHeight() - ;
                                 If( ::oWnd:oBar != nil, ::oWnd:oBar:nHeight() - 2,;
                                 ::oWnd:oTop:nHeight() ) - ;
                                 If( ::oWnd:oMsgBar != nil, ::oWnd:oMsgBar:nHeight(),;
                                 ::oWnd:oBottom:nHeight() ) - 38 )
       ::oLvw:SetImageList( ::oImageListPages )
       ::oLvw:bRClicked = { || If( ::oLvw:nLeft == 0,;
                                   ::oLvw:nLeft := ::oWnd:nWidth - ::oLvw:nWidth - 30,;
                                   ::oLvw:nLeft := 0 ) }

    return nil

    //----------------------------------------------------------------------------//

    static function PageBitmap( cEMF, nWidth, nHeight )

       local hDC1 := GetDC( GetDesktopWindow() )
       local hDC2 := CreateCompatibleDC( hDC1 )
       local hBmp := CreateCompatibleBitmap( hDC1, nWidth, nHeight )
       local hOldBmp := SelectObject( hDC2, hBmp )
       local hEMF := GetEnhMetaFile( cEmf )

       Rectangle( hDC2, 0, 0, nHeight, nWidth )
       XPlayEnhMetaFile( hDC2, hEMF, 0, 0, nHeight, nWidth )
       CloseEnhMetafile( hEMF )

       SelectObject( hDC2, hOldBmp )
       DeleteDC( hDC2 )
       ReleaseDC( hDC1 )

    return hBmp

    //----------------------------------------------------------------------------//

    METHOD BuildMenu() CLASS TPreview

       local nFor, oMenu, oMItem
       local lThemed := IsAppThemed()

       ::aFactor := Array( 9 )

       MENU oMenu
          oMenu:l2007    := ( nStyle == 2007 )
          oMenu:l2010    := ( nStyle == 2010 )
          MENUITEM FWString( "&File" )
          MENU
             MENUITEM oMItem PROMPT FWString( "&Print" ) ACTION If( ValType( ::bPrint ) == 'B', Eval( ::bPrint, Self ), ::PrintPage() ) ;
                MESSAGE FWString( "Print actual page" )

             oMItem:hBitmap = FWBitmap( "printer" )

             SEPARATOR

             MENUITEM oMItem PROMPT FWString( "&Exit" ) ACTION ::oWnd:End() ;
                MESSAGE FWString( "Exit from preview" )

             oMItem:hBitmap = FWBitmap( "Exit2" )
          ENDMENU

          MENUITEM FWString( "&Page" )
          MENU
             MENUITEM oMItem PROMPT FWString( "&First" ) ACTION ::TopPage() ;
                MESSAGE FWString( "Go to first page" )

             oMItem:hBitmap = FWBitmap( "top2" )

             MENUITEM oMItem PROMPT FWString( "&Previous" ) ACTION ::PrevPage() ;
                MESSAGE FWString( "Go to previous page" )

             oMItem:hBitmap = FWBitmap( "previous2" )

             MENUITEM oMItem PROMPT FWString( "&Next" ) ACTION ::NextPage() ;
                MESSAGE FWString( "Go to next page" )

             oMItem:hBitmap = FWBitmap( "next2" )

             MENUITEM oMItem PROMPT FWString( "&Last" ) ACTION ::BottomPage() ;
                MESSAGE FWString( "Go to last page" )

             oMItem:hBitmap = FWBitmap( "bottom2" )

             SEPARATOR

             MENUITEM oMItem PROMPT ::oMenuZoom PROMPT FWString( "&Zoom" ) ACTION ::Zoom( .T. ) ;
                MESSAGE FWString( "Page zoom" )

             oMItem:hBitmap = FWBitmap( "zoom2" )

             MENUITEM oMItem PROMPT ::oMenuUnZoom PROMPT FWString( "&Normal" ) ACTION ::Zoom( .T. ) ;
                MESSAGE FWString( "Page unzoom" )

             oMItem:hBitmap = FWBitmap( "onepage2" )

             MENUITEM FWString( "&Factor" ) MESSAGE FWString( "Zoom factor" )
             MENU
                for nFor := 1 to Len( ::aFactor )
                   MENUITEM ::aFactor[ nFor ]                  ;
                      PROMPT "&" + LTrim( Str( nFor ) )        ;
                      MESSAGE FWString( "Factor" ) + " " + LTrim( Str( nFor ) ) ;
                      ACTION ( ::oFactor:Set( oMenuItem:nHelpId ),;
                               Eval( ::oFactor:bChange ) )

                next
             ENDMENU

             SEPARATOR

             MENUITEM ::oMenuTwoPages PROMPT FWString( "&Two pages" ) ACTION ::TwoPages( .T. ) ;
                MESSAGE FWString( "Preview on two pages" )

             ::oMenuTwoPages:hBitmap = FWBitmap( "TwoPages2" )

             MENUITEM ::oMenuOnePage PROMPT FWString( "One &page" ) ACTION ::TwoPages(.T.) ;
                MESSAGE FWString( "Preview on one page" )

             ::oMenuOnePage:hBitmap = FWBitmap( "onepage2" )
          ENDMENU
       ENDMENU

       ::oMenuUnZoom:Disable()
       ::oMenuOnePage:Disable()

    return oMenu

    //----------------------------------------------------------------------------//

    METHOD CheckStyle() CLASS TPreview

       local o

       if nStyle == nil
          nStyle      := 0
          DEFAULT ::oWndMain   := WndMain()

          if ::oWndMain != nil
             if ( o := ::oWndMain:oMenu ) != nil
                nStyle   := Max( nStyle, If( o:l2010, 2010, 0 ) )
             endif

             if nStyle < 2010 .and. ( o := ::oWndMain:oMsgBar ) != nil
                nStyle   := Max( nStyle, If( o:l2010, 2010, If( o:l2007, 2007, 0 ) ) )
             endif

             if nStyle < 2010 .and. ( o := ::oWndMain:oTop ) != nil
                if o:IsKindOf( "TRIBBONBAR" )
                   nStyle   := Max( nStyle, If( o:l2010, 2010, 2007 ) )

                elseif o:IsKindOf( "TBAR" )
                   nStyle   := Max( nStyle, If( o:l2010, 2010, 2007 ) )
                   if Empty( nStyle ) .and. Len( o:aControls ) > 0 .and. o:aControls[ 1 ]:l97look
                      nStyle   := 97
                   endif
                endif
             endif
          endif
       endif

       lRebar   := ( IsAppThemed() .and. Empty( nStyle ) .and. bUserBtns == nil .and. nBtnW == nil .and. nBtnH == nil )

    return Self

    //----------------------------------------------------------------------------//

    METHOD GoPage( nPage ) CLASS TPreview

       local aFiles := ::oDevice:aMeta

       if nPage > Len( aFiles ) .OR. nPage < 1
          MsgBeep()
          return .F.
       endif

       ::nPage := nPage

       ::oMeta1:SetFile( aFiles[ ::nPage ] )
       if nStyle < 2007
          ::oPage:SetText( FWString( "Page number:" ) + " " + ;
                           LTrim( Str( ::nPage, 4, 0 ) ) + " / " + ;
                           LTrim( Str( Len( aFiles ) ) ) )
       endif

       ::oBar:Refresh()
       ::oMeta1:Refresh()

       if ::lTwoPages
          if Len( aFiles ) >= ::nPage + 1
             ::oMeta2:SetFile( aFiles[ ::nPage + 1 ] )
          else
             ::oMeta2:SetFile( "" )
          endif
          ::oMeta2:Refresh()
       endif

       ::oMeta1:SetFocus()

    return .T.

    //----------------------------------------------------------------------------//

    METHOD PaintMeta() CLASS TPreview

       local oRect, oRect1, oRect2
       local aFiles := ::oDevice:aMeta  // DEVICE
       local nWidth, nHeight, nMaxWidth, nAspect, nMetaWidth, nGutter

       if ::oWnd != nil
          if IsIconic( ::oWnd:hWnd )
             return nil
          endif
          oRect          := ::oWnd:GetCliRect()
          oRect:nTop     += ( ::oBar:nHeight    + 4 )
          oRect:nBottom  -= ( IfNil( ::oWnd:oMsgBar, ::oWnd:oBottom ):nHeight + 4 + 5 )  // 5 shadow depth
          nMaxWidth      := oRect:nWidth * If( ::lTwoPages, 0.40, 0.95 )
          nGutter        := oRect:nWidth * 0.05

          nAspect        := ::oDevice:nHorzSize() / ::oDevice:nVertSize()

          nMetaWidth     := If( ::lZoom, nMaxWidth, oRect:nHeight * nAspect )
          nHeight        := oRect:nHeight
          if nMetaWidth > nMaxWidth
             nMetaWidth  := nMaxWidth
             nHeight     := nMetaWidth / nAspect
          endif

          if ::lTwoPages

             oRect1  := OClone( oRect )
             WITH OBJECT oRect1
                :nTop          += ( oRect:nHeight - nHeight ) / 2
                :nLeft         := oRect:nLeft + oRect:nWidth / 2 - nMetaWidth - nGutter
                :nWidth        := nMetaWidth
                :nHeight       := nHeight
             END

             oRect2  := OClone( oRect1 )
             WITH OBJECT oRect2
                :nLeft         := oRect:nLeft + oRect:nWidth / 2 + nGutter
                :nWidth        := nMetaWidth
             END

             if ::nPage == Len( aFiles )
                ::oMeta2:SetFile( "" )
             else
                ::oMeta2:SetFile( aFiles[ ::nPage + 1 ] )
             endif

             ::oMeta1:SetCoors( oRect1 )
             ::oMeta2:SetCoors( oRect2 )
             ::oMeta1:Refresh()
             ::oMeta2:Show()

          else
             oRect1  := OClone( oRect )
             WITH OBJECT oRect1
                :nTop          += ( oRect:nHeight - nHeight ) / 2
                :nLeft         += ( oRect:nWidth - nMetaWidth ) / 2
                :nWidth        := nMetaWidth
                :nHeight       := nHeight
             END

             ::oMeta2:Hide()
             ::oMeta1:SetCoors( oRect1 )
             ::oMeta1:Refresh()

          endif

          ::oMeta1:SetFocus()

       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD NextPage() CLASS TPreview

       local aFiles  := ::oDevice:aMeta  // DEVICE

       if ::nPage >= Len( aFiles )
          MsgBeep()
          return nil
       endif

       ::nPage++

       ::oMeta1:SetFile( aFiles[ ::nPage ] )
       if nStyle < 2007
          ::oPage:SetText( FWString( "Page number:" ) + LTrim( Str( ::nPage, 4, 0 ) ) + ;
                           " / " + LTrim( Str( Len( aFiles ) ) ) )
       endif

       ::oBar:Refresh()
       ::oMeta1:Refresh()

       if ::lTwoPages
          if Len( aFiles ) >= ::nPage + 1
             ::oMeta2:SetFile( aFiles[ ::nPage + 1 ] )
          else
             ::oMeta2:SetFile( "" )
          endif
          ::oMeta2:Refresh()
       endif

       ::oMeta1:SetFocus()

    return nil

    //----------------------------------------------------------------------------//

    METHOD PrevPage() CLASS TPreview

       local aFiles  := ::oDevice:aMeta  // DEVICE

       if ::nPage == 1
          MsgBeep()
          return nil
       endif

       ::nPage--

       ::oMeta1:SetFile( aFiles[ ::nPage ] )

       if nStyle < 2007
          ::oPage:SetText( FWString( "Page number:" ) + LTrim( Str( ::nPage, 4, 0 ) ) + ;
                           " / " + LTrim( Str( Len( aFiles ) ) ) )
       endif
       ::oBar:Refresh()
       ::oMeta1:Refresh()

       if ::lTwoPages
          if Len( aFiles ) >= ::nPage + 1
             ::oMeta2:SetFile( aFiles[ ::nPage + 1 ] )
          else
             ::oMeta2:SetFile( "" )
          endif
          ::oMeta2:Refresh()
       endif

       ::oMeta1:SetFocus()

    return nil

    //----------------------------------------------------------------------------//

    METHOD TopPage() CLASS TPreview

       local aFiles  := ::oDevice:aMeta  // DEVICE

       if ::nPage == 1
          MsgBeep()
          return nil
       endif

       ::nPage = 1

       ::oMeta1:SetFile( aFiles[ ::nPage ] )
       if nStyle < 2007
          ::oPage:SetText( FWString( "Page number:" ) + " " + LTrim( Str( ::nPage, 4, 0 ) ) + ;
                           " / " + LTrim( Str( Len( aFiles ) ) ) )
       endif
       ::oBar:Refresh()
       ::oMeta1:Refresh()

       if ::lTwoPages
          if Len( aFiles ) >= ::nPage + 1
             ::oMeta2:SetFile( aFiles[ ::nPage + 1 ] )
          else
             ::oMeta2:SetFile( "" )
          endif
          ::oMeta2:Refresh()
       endif

       ::oMeta1:SetFocus()

    return nil

    //----------------------------------------------------------------------------//

    METHOD BottomPage() CLASS TPreview

       local aFiles  := ::oDevice:aMeta  // DEVICE

       if ::nPage == Len( aFiles )
          MsgBeep()
          return nil
       endif

       ::nPage = Len( aFiles )

       ::oMeta1:SetFile( aFiles[ ::nPage ] )
       if nStyle < 2007
          ::oPage:SetText( FWString( "Page number:" ) + " " + LTrim( Str( ::nPage, 4, 0 ) ) + ;
                           " / " + LTrim( Str( Len( aFiles ) ) ) )
       endif
       ::oBar:Refresh()
       ::oMeta1:Refresh()

       if ::lTwoPages
          ::oMeta2:SetFile( "" )
          ::oMeta2:Refresh()
       endif

       ::oMeta1:SetFocus()

    return nil

    //----------------------------------------------------------------------------//

    METHOD TwoPages( lMenu ) CLASS TPreview

       DEFAULT lMenu := .F.

       ::lTwoPages := ! ::lTwoPages

       if ::lTwoPages

          if Len( ::oDevice:aMeta) == 1 // solo hay una pagina   // DEVICE
             ::lTwoPages := ! ::lTwoPages
             MsgBeep()
             return nil
          endif

          if ::oDevice:nHorzSize() >= ;        // Apaisado  // DEVICE
             ::oDevice:nVertSize()  // DEVICE
             ::lTwoPages := ! ::lTwoPages
             MsgBeep()
             return nil
          endif

          if ::lZoom
             ::Zoom( .T. )
          endif

          if ! lRebar
             ::oTwoPages:FreeBitmaps()
             ::oTwoPages:hBitmap1 = FWBitmap( "OnePage2" )
             ::oTwoPages:cMsg = FWString( "Preview on one page" )
             ::oTwoPages:cTooltip = StrTran( FWString( "One &page" ), '&', '' )
          else
             ::oBar:ChangeBitmap( 6, 10+2 )
             ::oBar:SetTooltip( 6, StrTran( FWString( "One &page" ), '&', '' ) )
             ::oBar:SetMessage( 6, FWString( "Preview on one page" ) )
          endif

          if ::oWnd:oMenu != nil
             ::oMenuTwoPages:Disable()
             ::oMenuOnePage:Enable()
          endif

          ::oLvw:Hide()

       else

          if ! lRebar
             ::oTwoPages:FreeBitmaps()
             ::oTwoPages:hBitmap1 = FWBitmap( "twopages2" )
             ::oTwoPages:cMsg = FWString( "Preview on two pages" )
             ::oTwoPages:cTooltip = FWString( "Two pages" )
          else
             ::oBar:ChangeBitmap( 6, 6 )
             ::oBar:SetTooltip( 6, FWString( "&Two pages" ) )
             ::oBar:SetMessage( 6, FWString( "Preview on two pages" ) )
          endif

          if ::oWnd:oMenu != nil
             ::oMenuTwoPages:Enable()
             ::oMenuOnePage:Disable()
          endif

          if ! ::lListViewHide
             ::oLvw:Show()
          endif

       endif

       if lMenu .and. ! IsAppThemed()
          ::oTwoPages:Refresh()
       endif

       ::oWnd:Refresh()
       ::PaintMeta()

    return nil

    //----------------------------------------------------------------------------//

    METHOD Zoom( lMenu ) CLASS TPreview

       DEFAULT lMenu := .F.

       ::lZoom := ! ::lZoom

       if ::oLvw != nil
          if IsWindowVisible( ::oLvw:hWnd )
             ::oLvw:Hide()
          else
             ::oLvw:Show()
          endif
       endif

       if ::lZoom

          if ::lTwoPages
             ::TwoPages( .T. )
          endif

          if ! lRebar
             ::oZoom:FreeBitmaps()
             ::oZoom:hBitmap1 = FWBitmap( "onepage2" )    //"Unzoom2" )
             ::oZoom:cMsg := FWString( "Page unzoom" )
             ::oZoom:cTooltip := StrTran( FWString( "&Normal" ), "&", "" )
          else
             ::oBar:ChangeBitmap( 5,5 )
             ::oBar:SetTooltip( 5, StrTran( FWString( "&Normal" ), "&", "" ) )
             ::oBar:SetMessage( 5, FWString( "Page unzoom" ) )
          endif

          if ::oWnd:oMenu != nil
             ::oMenuZoom:Disable()
             ::oMenuUnZoom:Enable()
          endif

          ::oWnd:oVScroll:SetRange( 1, VSCROLL_RANGE )

          if ::nZFactor > 1
             ::oWnd:oHScroll:SetRange( 1, HSCROLL_RANGE )
          endif

          ::oMeta1:ZoomIn()

       else

          if ! lRebar
             ::oZoom:FreeBitmaps()
             ::oZoom:hBitmap1 = FWBitmap( "Zoom2" )
             ::oZoom:cMsg = FWString( "Page zoom" )
             ::oZoom:cTooltip := FWString( "Zoom" )
          else
             ::oBar:ChangeBitmap( 5, 5 )
             ::oBar:SetTooltip( 5, FWString( "Zoom" ) )
             ::oBar:SetMessage( 5, FWString( "Page zoom" ) )
          endif

          if ::oWnd:oMenu != nil
             ::oMenuZoom:Enable()
             ::oMenuUnZoom:Disable()
          endif

          ::oWnd:oVScroll:SetRange( 0, 0 )
          ::oWnd:oHScroll:SetRange( 0, 0 )

          ::oMeta1:ZoomOut()
          ::nZFactor = 1
          if ::oWnd:oMenu != nil
             AEval( ::aFactor, { | val, elem | val:SetCheck( ( elem == 1 ) ) } )
          endif
          ::oFactor:Set( 1 )

       endif

       if lMenu .and. ! IsAppThemed()
          ::oZoom:Refresh()
       endif

       ::oWnd:Refresh()  // Fix for clearing shadows when unzoomed .. fwh 11.5
       ::PaintMeta()

    return nil

    //----------------------------------------------------------------------------//

    METHOD VScroll( nType, lPage, nSteps ) CLASS TPreview

       local nYfactor, nYorig, nStep

       DEFAULT lPage := .F.

       if nType == GO_UP
          if ::oWnd:oVScroll:GetPos() <= ::oWnd:oVScroll:nMin
             return nil
          endif
       else
          if ::oWnd:oVScroll:GetPos() > ::oWnd:oVScroll:nMax
             return nil
          endif
       endif

       nYfactor := Int( ::oDevice:nVertRes() / ::oWnd:oVScroll:nMax )  // DEVICE

       if nSteps != nil
          nStep := nSteps
       elseif lPage
          nStep := ::oWnd:oVScroll:nMax / 10
       else
          nStep := 1
       endif

       if nType == GO_UP
          nStep := -nStep
       elseif nType == GO_POS
          ::oWnd:oVscroll:SetPos( nSteps )
          nStep := 0
       endif

       nYorig := nYfactor * ( ::oWnd:oVScroll:GetPos() + nStep - 1 )

       if nYorig > ::oDevice:nVertRes()    // DEVICE
          nYorig := ::oDevice:nVertRes()   // DEVICE
       endif

       if nYorig < 0
          nYorig := 0
       endif

       ::oMeta1:SetOrg( nil, nYorig / ::oDevice:nVertRes() * 10 )  // DEVICE

       ::oMeta1:Refresh()

    return nil

    //----------------------------------------------------------------------------//

    METHOD HScroll( nType, lPage, nSteps ) CLASS TPreview

       local nXfactor, nXorig, nStep

       DEFAULT lPage := .F.

       if nType == GO_UP
          if ::oWnd:oHScroll:GetPos() <= ::oWnd:oHScroll:nMin
             return nil
          endif
       else
          if ::oWnd:oHScroll:GetPos() > ::oWnd:oHScroll:nMax
             return nil
          endif
       endif

       nXfactor := Int( ::oDevice:nHorzRes() / ::oWnd:oHScroll:nMax )  // DEVICE

       if nSteps != nil
          nStep := nSteps
       elseif lPage
          nStep := ::oWnd:oHScroll:nMax/10
       else
          nStep := 1
       endif

       if nType == GO_LEFT
          nStep := -nStep
       elseif nType == GO_POS
          ::oWnd:oHscroll:SetPos( nSteps )
          nStep := 0
       endif

       nXorig := nXfactor * ( ::oWnd:oHScroll:GetPos() + nStep - 1 )

       if nXorig > ::oDevice:nHorzRes()     // DEVICE
          nXorig := ::oDevice:nHorzRes()    // DEVICE
       endif

       if nXorig < 0
          nXorig := 0
       endif

       ::oMeta1:SetOrg( nXorig / ::oDevice:nHorzRes() * 10, nil )  // DEVICE

       ::oMeta1:Refresh()

    return nil

    //----------------------------------------------------------------------------//

    METHOD SetOrg1( nX, nY ) CLASS TPreview

       local oCoors
       local nXStep, nYStep, nXFactor, nYFactor,;
             nWidth, nHeight, nXOrg

       if ::lZoom
          ::Zoom( .T. )
          return nil
       endif

       oCoors   := ::oMeta1:GetRect()
       nWidth   := oCoors:nRight - oCoors:nLeft + 1
       nHeight  := oCoors:nBottom - oCoors:nTop + 1

       if .f.
          nXStep   := Max( Int( nX / nWidth * HSCROLL_RANGE ) - 9, 0 )
          nXFactor := Int( ::oDevice:nHorzRes() / HSCROLL_RANGE )  // DEVICE
       endif

       if .f.
          nYStep   := Max( Int( nY / nHeight * VSCROLL_RANGE ) - 9, 0 )
          nYFactor := Int( ::oDevice:nVertRes() / VSCROLL_RANGE )  // DEVICE
       endif

       ::Zoom( .T. )

       if ! Empty( nXStep )
          ::HScroll( 2,, nxStep )
          ::oWnd:oHScroll:SetPos( nxStep )
       endif

       if ! Empty( nYStep )
          ::VScroll( 2,, nyStep )
          ::oWnd:oVScroll:SetPos( nyStep )
       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD SetOrg2( nX, nY ) CLASS TPreview

       local oCoors
       local aFiles
       local nXStep, nYStep, nXFactor, nYFactor,;
             nWidth, nHeight, nXOrg

       if ::oMeta2:cCaption == ""
          return nil
       endif

       if ::lZoom
          ::Zoom( .T. )
          return nil
       endif

       oCoors := ::oMeta2:GetRect()
       nWidth   := oCoors:nRight - oCoors:nLeft + 1
       nHeight  := oCoors:nBottom - oCoors:nTop + 1

       if .f.
          nXStep   := Max( Int( nX / nWidth * HSCROLL_RANGE ) - 9, 0 )
          nXFactor := Int( ::oDevice:nHorzRes() / HSCROLL_RANGE )
       endif

       if .f.
          nYStep   := Max( Int( nY / nHeight * VSCROLL_RANGE ) - 9, 0 )
          nYFactor := Int( ::oDevice:nVertRes() / VSCROLL_RANGE )  // DEVICE
       endif

       ::oMeta1:SetFile( ::oMeta2:cCaption )

       aFiles := ::oDevice:aMeta  // DEVICE

       if ::nPage = Len( aFiles )
          ::oMeta2:SetFile( "" )
       else
          ::oMeta2:SetFile( aFiles[ ++::nPage ] )
       endif

       if nStyle < 2007
          ::oPage:Refresh()
       endif
       ::oBar:Refresh()

       ::Zoom( .T. )

       if ! Empty( nXStep )
          ::HScroll( 2,, nxStep )
          ::oWnd:oHScroll:SetPos( nxStep )
       endif

       if ! Empty( nYStep )
          ::VScroll( 2,, nyStep )
          ::oWnd:oVScroll:SetPos( nyStep )
       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD CheckKey( nKey, nFlags ) CLASS TPreview

       if ! ::lZoom
          do case
             case nKey == VK_HOME
                  ::TopPage()

             case nKey == VK_END
                  ::BottomPage()

             case nKey == VK_PRIOR
                  ::PrevPage()

             case nKey == VK_NEXT
                  ::NextPage()

          endcase
       else
          do case
             case nKey == VK_UP
                  ::oWnd:oVScroll:GoUp()

             case nKey == VK_PRIOR
                  ::oWnd:oVScroll:PageUp()

             case nKey == VK_DOWN
                  ::oWnd:oVScroll:GoDown()

             case nKey == VK_NEXT
                  ::oWnd:oVScroll:PageDown()

             case nKey == VK_LEFT
                  ::oWnd:oHScroll:GoUp()

             case nKey == VK_RIGHT
                  if ::oWnd:oHScroll != nil .and. ::oWnd:oHScroll:nMax > 0
                     ::oWnd:oHScroll:GoDown()
                  endif

             case nKey == VK_HOME
                  ::oWnd:oVScroll:GoTop()
                  ::oWnd:oHScroll:GoTop()
                  ::oMeta1:SetOrg( 0, 0 )
                  ::oMeta1:Refresh()

             case nKey == VK_END
                  ::oWnd:oVScroll:GoBottom()
                  ::oWnd:oHScroll:GoBottom()
                  ::oMeta1:SetOrg( .8 * ::oDevice:nHorzRes(), .8 * ::oDevice:nVertRes() )  // DEVICE
                  ::oMeta1:Refresh()
          endcase
       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD CheckMouseWheel( nKeys, nDelta, nXPos, nYPos ) CLASS TPreview

       if ! ::lZoom
          if lAnd( nKeys, MK_MBUTTON )
             if nDelta > 0
                ::TopPage()
             else
                ::BottomPage()
             endif
          else
             if nDelta > 0
                ::PrevPage()
             else
                ::NextPage()
             endif
          endif
       else
          if lAnd( nKeys, MK_MBUTTON )
             if nDelta > 0
                if ::oWnd:oVScroll:GetPos() > ::oWnd:oVScroll:nMin
                   ::oWnd:oVScroll:PageUp()
                endif
             else
                if ::oWnd:oVScroll:GetPos() < ::oWnd:oVScroll:nMax
                   ::oWnd:oVScroll:PageDown()
                endif
             endif
          else
             if nDelta > 0
                if ::oWnd:oVScroll:GetPos() > ::oWnd:oVScroll:nMin
                   ::oWnd:oVScroll:GoUp()
                endif
             else
                if ::oWnd:oVScroll:GetPos() < ::oWnd:oVScroll:nMax
                   ::oWnd:oVScroll:GoDown()
                endif
             endif
          endif
       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD SelPrinter( cPrinter ) CLASS TPreview

       local cOldPrinter := GetProfString( "windows", "device" , "" )

       WriteProfString( "windows", "device", cPrinter )
       SysRefresh()
       PrinterInit()

       DeleteDC( ::oDevice:hDC )

       ::oDevice:hDC    = GetPrintDefault( GetActiveWindow() )
       ::oDevice:cModel = cPrinter

       SysRefresh()
       WriteProfString( "windows", "device", cOldPrinter )

    RETURN nil

    //----------------------------------------------------------------------------//

    METHOD SetFactor( nValue ) CLASS TPreview

       local lInit := .F.

       if nValue == nil .and. ::oWnd:oMenu != nil
          AEval( ::aFactor, { | v, e | v:nHelpId := e } )
          nValue := ::nZFactor
          lInit  := .T.
       endif

       if ::oWnd:oMenu != nil
          AEval( ::aFactor, { | val, elem | val:SetCheck( elem == nValue ) } )
       endif

       ::oMeta1:SetZoomFactor( ::nZFactor, ::nZFactor * 2 )

       if ! ::lZoom .and. ! lInit
          ::Zoom( .T. )
       endif

       if ::lZoom
          ::oWnd:oVScroll:SetRange( 1, VSCROLL_RANGE )
          if ::nZFactor > 1
             ::oWnd:oHScroll:SetRange( 1, HSCROLL_RANGE )
          else
             ::oWnd:oHScroll:SetRange( 0, 0 )
          endif
       endif

       ::oMeta1:SetFocus()

    return nil

    //----------------------------------------------------------------------------//

    METHOD PrintersMenu() CLASS TPreview

       local oPop, aPrinters := aGetPrinters()

       MENU oPop POPUP
          oPop:l2007 = ( nStyle == 2007 )
          oPop:l2010 = ( nStyle == 2010 )

          AEval( aPrinters, { | cPrinter | MenuAddItem( cPrinter,,;
                 cPrinter $ ::oDevice:cModel,,;
                 { | oMenuItem | ::SelPrinter( oMenuItem:cPrompt ),;
                 oMenuItem:oMenu:UnCheckAll(), oMenuItem:SetCheck( .T. ) } ) } )
       ENDMENU

    return oPop

    //----------------------------------------------------------------------------//

    METHOD PrintPage() CLASS TPreview

       local hMeta   := ::oMeta1:hMeta
       local oDlg, oRad, oPageIni, oPageEnd
       local nOption := 1, nFirst := 1, nLast := Len( ::oDevice:aMeta )  // DEVICE
       local oThis := Self

       if nLast == 1
          ::PrintPrv( nil, nOption, nFirst, nLast )
          return nil
       endif

       DEFINE DIALOG oDlg SIZE 400, 183 TITLE FWString( "Printing" )

       @ 8, 8 GROUP PROMPT FWString( "Printing range" ) SIZE 135, 72 PIXEL OF oDlg

       @ 18, 18 RADIO oRad VAR nOption ;
          ITEMS FWString( "All" ), FWString( "Current page" ), FWString( "Pages" ) ;
          ON CHANGE If( nOption == 3,;
                        ( oPageIni:Enable(), oPageEnd:Enable() ),;
                        ( oPageIni:Disable(), oPageEnd:Disable() ) ) PIXEL

       @ 61, 30 SAY FWString( "From" ) OF oDlg PIXEL

       @ 60, 53 GET oPageIni ;
          VAR nFirst PICTURE "@K 99999" ;
          VALID If( nFirst < 1 .or. nFirst > nLast, ( MsgBeep(), .F. ), .T. ) ;
          OF oDlg SIZE 22, 11 PIXEL

       @ 61, 80 SAY FWString( "To" ) OF oDlg PIXEL

       @ 60, 103 GET oPageEnd ;
          VAR nLast PICTURE "@K 99999" ;
          VALID If( nLast < nFirst .or. nLast > Len( ::oDevice:aMeta ),; // DEVICE
                    ( MsgBeep(),.F. ), .T.) OF oDlg PIXEL

       @ 10, 152 BUTTON FWString( "&Ok" ) OF oDlg SIZE 42, 14 ;
          ACTION oThis:PrintPrv( oDlg, nOption, nFirst, nLast ) PIXEL

       @ 28, 152 BUTTON FWString( "&Cancel" ) OF oDlg SIZE 42, 14 ;
          ACTION oDlg:End() PIXEL

       ACTIVATE DIALOG oDlg CENTERED ;
          ON INIT ( oPageIni:Disable(), oPageEnd:Disable(), .T. )

    return nil

    //----------------------------------------------------------------------------//

    METHOD PrintPrv( oDlg, nOption, nPageIni, nPageEnd ) CLASS TPreview

       local oDevice := ::oDevice   // DEVICE
       local aFiles  := oDevice:aMeta
       local hMeta   := ::oMeta1:hMeta
       local nFor

       CursorWait()

       StartDoc( oDevice:hDC, oDevice:cDocument )

       do case

          case nOption == 1                           // All

              for nFor := 1 to Len( aFiles )
                  StartPage( oDevice:hDC )
                  hMeta := GetEnhMetaFile( aFiles[ nFor ] )
                  PlayEnhMetaFile( oDevice:hDC, hMeta,, .t. )
                  DeleteEnhMetafile( hMeta )
                  EndPage( oDevice:hDC )
              next

         case nOption == 2                           // Current page

              StartPage( oDevice:hDC )
              hMeta := ::oMeta1:hMeta
              PlayEnhMetaFile( oDevice:hDC, hMeta,, .t. )
              EndPage( oDevice:hDC )

         case nOption == 3                           // Range

              for nFor := nPageIni to nPageEnd
                   StartPage( oDevice:hDC )
                   hMeta := GetEnhMetaFile( aFiles[ nFor ] )
                   PlayEnhMetaFile( oDevice:hDC, hMeta,, .t. )
                   DeleteEnhMetafile( hMeta )
                   EndPage( oDevice:hDC )
              next

         endcase

         EndDoc( oDevice:hDC )

         CursorArrow()

         if oDlg != nil
            oDlg:End()
         endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD ExportToMSWord() CLASS TPreview

       local oDoc

       if ValType( ::bExportToWord ) == 'B'
          return Eval( ::bExportToWord, Self )
       endif

       oDoc = ConvertToWordDoc( Self )

       if oDoc != nil
          oDoc:Application:Visible   := .t.
       endif

    return Self

    //----------------------------------------------------------------------------//

    METHOD SaveAsMenu() CLASS TPreview

       local oPop, oMItem

       MENU oPop POPUP
          oPop:l2007 = ( nStyle == 2007 )
          oPop:l2010 = ( nStyle == 2010 )

          MENUITEM oMItem PROMPT FWString( "DOC Format" ) ;
             ACTION ::SaveAs( .f. )

          oMItem:hBitmap = FWBitmap( "Word2" )

          MENUITEM oMItem PROMPT FWString( "PDF Format" ) ;
             ACTION ::SaveAs( .t. )

          oMItem:hBitmap = FWBitmap( "pdf" )
       ENDMENU

    return oPop

    //----------------------------------------------------------------------------//

    METHOD ResizeListView() CLASS TPreview

       if ::oWnd != nil .and. ::oLvw != nil
          ::oLvw:nHeight = ::oWnd:GetCliRect():nHeight - 2 - ;
                           If( ::oWnd:oBar != nil, ::oWnd:oBar:nHeight() - 2,;
                               ::oWnd:oTop:nHeight() ) - ;
                           If( ::oWnd:oMsgBar != nil, ::oWnd:oMsgBar:nHeight(),;
                               ::oWnd:oBottom:nHeight() )
       endif

    return nil

    //----------------------------------------------------------------------------//

    METHOD SaveAs( lPDF, cFile, lView ) CLASS TPreview

       static lWordPDF   := .t.

       local oWord, nVer, oDoc
       local cExt, cMsg

       if lPDF
          if ValType( ::bSaveAsPDF ) == 'B'
             return Eval( ::bSaveAsPDF, Self, cFile, lView )
          elseif ! lWordPDF // tested earlier and found Word with PDF plugin not availble
             return FWSavePreviewToPDF( Self, cFile, lView )
          endif
       else
          if ValType( ::bSaveAsWord ) == 'B'
             return Eval( ::bSaveAsWord, Self, cFile, lView )
          endif
       endif

       oWord       := WinWordObj()
       if oWord == nil
          lWordPDF    := .f.
          if lPDF
            return FWSavePreviewToPDF( Self, cFile, lView )
          ELSE
            return ToWordDocViaWriter( Self, , "W" )
          Endif
       endif
       nVer        := Val( oWord:Version )

       if lPDF
          if nVer >= 12.0 .and. WordHasPDFPlugIn()
             cExt  := "*.pdf"
          else
             lWordPDF    := .f.
             return FWSavePreviewToPDF( Self, cFile, lView )
          endif
       else
          cExt = If( nVer < 12.0, "*.doc", "*.docx; *.doc" )
       endif
       cMsg    = If( lPDF, "PDF", "Doc" ) + " " + ;
                 FWString( "File to Save" ) + "( " + cExt + ") |" + cExt + "|"

       if Empty( cFile ) .and. Empty( cFile := cGetFile( cMsg, FWString( "File to Save" ), 1, CurDir(), , .t. ) )
          return nil
       endif

       if !( Lower( cFileExt( cFile ) ) $ cExt )
          cFile = cFilePath( cFile ) + cFileNoExt( cFile ) + ;
                  If( lPDF, ".pdf", If( nVer < 12.0, ".doc", ".docx" ) )
       endif

       DEFAULT lView := MsgYesNo( FWString( "View" ) + " " + cFile + "?", FWString( "Please select" ) )
       oDoc  = ConvertToWordDoc( Self )

       if oDoc != nil
          TRY
             oDoc:ExportAsFixedFormat( cFile, 17, lView )
          CATCH
             lWordPDF    := .f.
    //         MsgInfo( FWString( "PDF Plugin Error" ), FWString( "Information" ) )
          END
          if lPDF
             oDoc:Close( .f. )
             if ! lWordPDF
                // word failed to save as PDF due to PDF Plugin Error
                return FWSavePreviewToPDF( Self, cFile, lView )
             endif
          else
             if nVer >= 12.0
                oDoc:SaveAs( cFile, If( Lower( cFileExt( cFile ) ) == 'doc', 0, 16 ) )
             else
                oDoc:SaveAs( cFile )
             endif
             if lView
                oDoc:Application:Visible := .t.
             else
                oDoc:Close( .f. )
             endif
          endif
       endif

    return cFile

    //----------------------------------------------------------------------------//

    METHOD SendEmail() CLASS TPreview

       local oMail, cName, cFile

       cName := If( ::oReport != nil, ::oReport:cName, ::oDevice:cDocument )
       cFile := cFilePath( ::oDevice:aMeta[ 1 ] ) + StrTran( cName, '.', '' ) + ;
                Left( HB_TToS( HB_DateTime() ), 14 ) + ".pdf"

       CursorWait()
       cFile := ::SaveAs( .t., cFile, .f. )
       CursorArrow()

       if ! File( cFile )
          MsgInfo( FWString( "PDF not saved to send Email" ), FWString( "Information" ) )
       elseif ::bEmail != nil
          Eval( ::bEmail, Self, cName, cFile )
       else
          DEFINE MAIL oMail ;
             SUBJECT cName ;
             TEXT "" ;
             FILES cFile, cFile ;
             FROM USER

          ACTIVATE MAIL oMail

          // MsgInfo( oMail:nRetCode )  check the returned code!
       endif

       ::oMeta1:SetFocus()

    return nil

    //----------------------------------------------------------------------------//

    function RPreview( oDevice, oReport )

       local oPreview := TPreview():New( oDevice, oReport )

       oDevice:oPreview := oPreview

       oPreview:Activate()

    return nil

    //----------------------------------------------------------------------------//

    function ConvertToWordDoc( oPreview )

       local aFiles   := oPreview:oDevice:aMeta
       local oWord, oDoc, cEMF

       if Len( aFiles ) > 0
          if ( oWord := WinWordObj() ) == nil
             lWord    := .f.
             MsgAlert( FWString( "MS Word not installed" ), FWString( "Alert" ) )
             oDoc = ToWordDocViaWriter( oPreview, aFiles, "W" )
          else
             lWord    := .t.
             oDoc = oWord:Documents:Add()
             if oDoc == nil
                MsgAlert( FWString( "Failed to Create Word Document" ), FWString( "Alert" ) )
             else
                oDoc:PageSetup:Orientation := If( oPreview:oDevice:GetOrientation() == 1, 0, 1 )
                WITH OBJECT oDoc:PageSetup
                   :LeftMargin    := 0
                   :TopMargin     := 0
                   :RightMargin   := 0
                   :BottomMargin  := 0
                END
                for each cEMF in aFiles
                   oWord:Selection:InlineShapes:AddPicture( cEMF, .f., .t. )
                next
                // oDoc:Application:Visible   := .t.
             endif
          endif
       else
          MsgAlert( FWString( "There is no output for export" ), FWString( "Alert" ) )
       endif

    return oDoc

    //----------------------------------------------------------------------------//

    Function ToWordDocViaWriter( oPreview, aFiles, cFileType )

        local oWriter, oDesktop, oDoc, oCusor, oText, oGraphic, cEMF, cURL, i, aProp
        local oStyle, nPageWidth, nPageHeight, aPdfFilters
        local cExt, cMsg, cFile, oSize, oCursor

        DEFAULT cFileType := "W"  // ByDefault Word File
        DEFAULT aFiles := oPreview:oDevice:aMeta

        if Len( aFiles ) == 0
            MsgAlert( FWString( "There is no output for export" ), FWString( "Alert" ) )
            Return nil
        Endif

        if ( oWriter := SunCalcObj() ) == nil
            lCalc  := .f.
            MsgAlert( FWString( "No .Doc file manipulation software installed" ), FWString( "Alert" ) )
            Return NIL
        Endif
        lCalc    := .t.
        oDesktop := oWriter:CreateInstance( "com.sun.star.frame.Desktop" )

        // Create OpenOffice Word Instance with the Window Hidden Property
        aProp = {}
        AAdd( aProp, GetPropertyValue( oWriter, "Hidden", .T. ) )
        oDoc = oDesktop:LoadComponentFromURL( "private:factory/swriter", "_blank", 0, aProp )
        oDoc:Refresh()

        // Set Page Orientation Properties ie Portrait/Landscape
        aProp = {}
        AAdd( aProp, GetPropertyValue( oWriter, "PaperOrientation",;
              If( oPreview:oDevice:GetOrientation() == 1, 0, 1 ) )  ) // 0-> Portrait, 1-> Landscape
        oDoc:Printer:= aProp

        oStyle = oDoc:StyleFamilies:getByName( "PageStyles" ):getByName( "Standard" )

        // Set Page Margins
        oStyle:LeftMargin   = 0
        oStyle:TopMargin    = 0
        oStyle:RightMargin  = 0
        oStyle:BottomMargin = 0

        // Find out the Page's Size ie Height and width. Later this size is used to set the EMF image size while inserting on the page
        nPageWidth  = oStyle:Size:Width - oStyle:LeftMargin - oStyle:RightMargin
        nPageHeight = oStyle:Size:Height - oStyle:TopMargin - oStyle:BottomMargin

        // Create a Size Structure. This size structure is later used to set the image size
        oSize:= oWriter:Bridge_GetStruct( "com.sun.star.awt.Size" )
        oSize:Width:=nPageWidth
        oSize:Height = nPageHeight

        i = 1

        for each cEMF in aFiles

            cURL = ConvertToOoURL( cEMF )

            oText = oDoc:GetText()
            oCursor = oText:CreateTextCursor()
            oCursor:GotoEnd( .F. )

            if i > 1  // Applicable only for page nos > 1
                oText:InsertControlCharacter( oCursor, 0, .F. )  // 0->New Paragraph, 1->New line in a paragraph, 5->This control character appends a new paragraph.
            endif

            oGraphic = oDoc:CreateInstance( "com.sun.star.text.GraphicObject" )
            oGraphic:SetPropertyValue( "GraphicURL", cURL )
            oGraphic:SetPropertyValue( "AnchorType", 1 )  // com.sun.star.text.TextContentAnchorType.AS_CHARACTER
            oGraphic:SetSize( oSize )

            oText:InsertTextContent( oCursor:End, oGraphic, .F.)
            i++
        next

        // Convert the image links and then Embedd the images onto the document
        OoEmbeddGraphics( oWriter, oDoc )

        cExt = If( cFileType == "W", "*.doc", "*.pdf" )
        cMsg = If( cFileType == "W", "Doc", "PDF" ) + " " + ;
                   FWString( "File to Save" ) + "( " + cExt + ") |" + cExt + "|"

        if Empty( cFile := cGetFile( cMsg, "File to Save", 1, CurDir(), , .T. ) )
            oDoc:Close( 1 )  // To Close OpenOffice Writer
            oDesktop:terminate()  // To close the OpenOffice QuickOpen Window
            return nil
        endif

        if ! ( Lower( cFileExt( cFile ) ) $ cExt )
            cFile = cFilePath( cFile ) + cFileNoExt( cFile ) + ;
                    If( cFileType == "W", ".doc", ".pdf" )
        endif

        // Convert the FileName and Path to OpenOffice Standard URL
        cURL = ConvertToOoURL( cFile )


        // The Word or PDF file will be saved in the Temp Folder
        * cURL = ConvertToOoURL( Getenv( "TMP" ) + "\" )
        * cURL = cURL + cTempFile()

        if cFileType == "W"  // Word
           * cURL += "Doc"

            // Save the Writer File as Word 97/2000/XP .Doc file. This is the most compatible format
            aProp = {}
            AAdd( aProp, GetPropertyValue( oWriter, "FilterName", "MS Word 97" ) )
            oDoc:StoreToURL( cURL, aProp )

        Else  // PDF
            * cURL += "Pdf"

            // Save the Writer File as PDF file
            aPdfFilters = {}
            AAdd( aPdfFilters, GetPropertyValue( oWriter, "UseLosslessCompression", .T. )  ) // Specifies if graphics are exported to PDF using a lossless compression. If this property is set to true, it overwrites the "Quality" property
            AAdd( aPdfFilters, GetPropertyValue( oWriter, "ReduceImageResolution", .F. )  )
            AAdd( aPdfFilters, GetPropertyValue( oWriter, "Quality", 50 )  )  // Value can be between 1 to 100

            aProp = {}
            AAdd( aProp, GetPropertyValue( oWriter, "FilterName", "writer_pdf_Export" )  )
            AAdd( aProp, GetPropertyValue( oWriter, "FilterData", aPdfFilters )  )

            oDoc:StoreToURL( cURL, aProp )

        Endif

        // Inform the user about the Exported Filename along with the Full path
        * MsgInfo( cUrl )

        * oDoc:GetCurrentController():GetFrame():GetContainerWindow():SetVisible( .T. )
        oDoc:Close( 1 )  // To Close OpenOffice Word
        oDesktop:Terminate()  // To close the OpenOffice QuickOpen Window
        oDoc = nil

    return nil

    //------------------------------------//

    static Function OoEmbeddGraphics(oWriter,oDoc)

       local oDrawPage, oProvider, aProp, i, oGraphic

       oDrawPage = oDoc:DrawPage
       oProvider = oWriter:CreateInstance( "com.sun.star.graphic.GraphicProvider" )

       if oDrawPage:hasElements()
          for i = 0 To oDrawPage:Count - 1
              oGraphic = oDrawPage:getByIndex( i )
              if oGraphic:supportsService( "com.sun.star.text.TextGraphicObject" )
                 aProp = {}
                 AAdd( aProp, GetPropertyValue( oWriter, "URL", oGraphic:GraphicUrl ) )
                 oGraphic:Graphic = oProvider:queryGraphic( aProp )
              endIf
          next i
       endif

    return nil

    //----------------------------------------------------------------------------//

    static function WordHasPDFPlugIn()

       static lPDF

       local oWord, oFilter

       if lPDF == nil
          lPDF = .F.
          if ( oWord := WinWordObj() ) != nil .and. Val( oWord:Version ) >= 12.0
             for each oFilter in oWord:FileDialog( 2 ):Filters
                if "*.pdf" $ oFilter:Extensions
                   lPDF     := .t.
                   exit
                endif
             next
          endif
       endif

    return lPDF

    //--------------------------------------------------------------------//

    function RPrevUserBtns( bNewUserBtns, nBarStyle, aSize )

       local bPrev    := bUserBtns

       if PCount() > 0
          bUserBtns   := bNewUserBtns
          if PCount() > 1
             if nBarStyle == nil
                nStyle   := nil
             elseif ValType( nBarStyle ) == 'L' .and. nBarStyle == .t.
                nStyle   := 2007
             elseif ValType( nBarStyle ) == 'N' .and. AScan( { 97, 2007, 2010 }, nBarStyle ) > 0
                nStyle   := nBarStyle
             endif
             if PCount() > 2
                if ValType( aSize ) == 'A' .and. Len( aSize ) >= 2
                   nBtnW    := aSize[ 1 ]
                   nBtnH    := aSize[ 2 ]
                endif
             endif
          endif
       endif

    return bPrev

    //--------------------------------------------------------------------//


    att: Carlos FWH1404 XHARBOUT123, DBF XDEV

  5. bom dia pessoal

    estou com um erro assim,crie um funcao para ver uma data quando eu coloco dentro do sistema a funcao executa

    perfeita,mas na ora de sai eu clico no butom cancela ai da esse erro

    Application
    ===========
    Path and name: C:\new\fpm.exe (32 bits)
    Size: 9,232,896 bytes
    Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903)
    FiveWin Version: FWHX 14.04
    Windows version: 5.1, Build 2600 Service Pack 3
    Time from start: 0 hours 0 mins 27 secs
    Error occurred at: 13/07/2016, 10:22:55
    Error description: Error BASE/1081 Erro nos parƒmetros: +
    Args:
    [ 1] = C fpa001
    [ 2] = N 1
    Stack Calls
    ===========
    Called from: fpaltrec.prg => ALT_EVENT( 38 )
    Called from: fpmenu.prg => (b)FPM02( 175 )
    Called from: btnbmp.prg => TBTNBMP:CLICK( 464 )
    Called from: btnbmp.prg => TBTNBMP:LBUTTONUP( 660 )
    Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1723 )
    Called from: btnbmp.prg => TBTNBMP:HANDLEEVENT( 1417 )
    Called from: window.prg => _FWH( 3236 )
    Called from: => WINRUN( 0 )
    Called from: window.prg => TWINDOW:ACTIVATE( 1003 )
    Called from: fpmenu.prg => FPM02( 215 )
    System
    ======
    CPU type: Intel® Core2 Duo CPU E7300 @ 2.66GHz 2666 Mhz
    Hardware memory: 2038 megs
    Free System resources: 90 %
    GDI resources: 90 %
    User resources: 90 %
    Windows total applications running: 8
    1 , C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202
    2 , C:\WINDOWS\system32\SHELL32.dll
    3 , C:\WINDOWS\system32\SHLWAPI.dll
    4 , C:\new\fpm.exe
    5 , C:\new\freeimage.dll
    6 M, C:\WINDOWS\system32\msctfime.ime
    7 MCI command handling window, C:\WINDOWS\system32\WINMM.DLL
    8 TF_FloatingLangBar_WndTitle,
    Variables in use
    ================
    Procedure Type Value
    ==========================
    ALT_EVENT
    Local 1: U
    Local 2: C "fpa001"
    Local 3: N 1
    Local 4: U
    Local 5: L .F.
    (b)FPM02
    Param 1: O Class: TBTNBMP
    TBTNBMP:CLICK
    Local 1: O Class: TBTNBMP
    TBTNBMP:LBUTTONUP
    Param 1: N 31
    Param 2: N 39
    Param 3: O Class: TBTNBMP
    Local 1: U
    Local 2: L .T.
    TCONTROL:HANDLEEVENT
    Param 1: N 514
    Param 2: N 0
    Param 3: N 2031655
    Local 1: O Class: TBTNBMP
    Local 2: U
    TBTNBMP:HANDLEEVENT
    Param 1: N 514
    Param 2: N 0
    Param 3: N 2031655
    Local 1: O Class: TBTNBMP
    _FWH
    Param 1: N 2031655
    Param 2: N 514
    Param 3: N 0
    Param 4: N 2031655
    Param 5: N 7
    Local 1: O Class: TBTNBMP
    WINRUN
    Param 1: N 655602
    TWINDOW:ACTIVATE
    Param 1: C "MAXIMIZED"
    Param 2: U
    Param 3: U
    Param 4: U
    Param 5: U
    Param 6: U
    Param 7: U
    Param 8: B {|| ... }
    Param 9: U
    Param 10: U
    Param 11: U
    Param 12: U
    Param 13: U
    Param 14: U
    Param 15: U
    Param 16: U
    Param 17: U
    Param 18: U
    Param 19: U
    Local 1: O Class: TWINDOW
    Local 2: U
    Local 3: U
    FPM02
    Local 1: U
    Local 2: O Class: TICON
    Local 3: U
    Local 4: U
    Local 5: O Class: TCURSOR
    Local 6: U
    Local 7: U
    Local 8: O Class: TBRUSH
    Linked RDDs
    ===========
    DBF
    DBFFPT
    DBFBLOB
    DBFCDX
    DBFNTX
    DataBases in use
    ================
    Classes in use:
    ===============
    1 ERROR
    2 HASHENTRY
    3 HBCLASS
    4 HBOBJECT
    5 TBRUSH
    6 TCURSOR
    7 TWINDOW
    8 TCONTROL
    9 TICON
    10 TFONT
    11 TMENU
    12 TMENUITEM
    13 TBAR
    14 TRECT
    15 TBTNBMP
    16 TBITMAP
    17 TIMAGE
    18 TMSGBAR
    19 TMSGITEM
    20 TTIMER
    21 TSTRUCT
    22 TDIALOG
    23 TSAY
    24 TGET
    25 GET
    26 TWBROWSE
    27 TSCROLLBAR
    28 TREG32
    Memory Analysis
    ===============
    2159 Static variables
    Dynamic memory consume:
    Actual Value: 0 bytes
    Highest Value: 0 bytes
    ai eu tira a funcao e funciona normal corretamente
    esta e funcao que eu criei
    function vfvencida
    ** avisa se o funcionario tem ferias a vencer
    **
    **
    select &arq1
    data1=ctod(" / / ")
    data2=ctod(" / / ")
    data3=ctod(" / / ")
    data4=ctod(" / / ")
    este=0
    vano=0
    tano=0
    vano=year(mdata) - year(&arq1->dt_admiss)
    tano=(vano-&arq1->ferias)
    if vano<=0 .and. ! year(mdata)=year(&arq1->dt_admiss)
    data1=mdata
    data2=mdata + 365
    este=9
    tano=0
    endif
    if tano=0 .and. year(mdata)=year(&arq1->dt_admiss)
    data1=mdata
    data2=mdata + 365
    este=9
    tano=0
    endif
    if tano > 0
    cha1= tano * 365
    data3=mdata - cha1
    data1=data3
    data2=data3 + 365
    endif
    if este=9
    tano=1
    endif
    For x=1 to tano
    sz=dtoc(&arq1->dt_admiss)
    sa=substr(sz,1,6)
    az=strzero(year(data1),4)
    ax=strzero(year(data2),4)
    xx=sa+subs(az,3,2)
    aa=sa+subs(ax,3,2)
    // xss=ctod(aa)+365
    // xss=xss-30
    vdata1=ctod(xx)
    vdata2=ctod(aa)-1
    data1= data2
    data2= data2 + 365
    Next
    FCheca:=ctod(" / / ")
    fcheca:=vdata2
    if year(Fcheca)=year(mdata)
    if month(Fcheca)=month(mdata)
    msgstop("As ferias deste Funcionario"+chr(13)+;
    "Vence este mes "+dtoc(Fcheca),"Aviso")
    endif
    endif
    **********************************************************
    select &arq5
    return .t.
    deste ja obrigado
    carlos
    fwh 14.04 xharbour 1.2.3 dbf ,xdev
  6. ola pessoal

    eu nunca usei array,preciso de fazer um funcao assim

    ler do banco de dados para um array,com 5 variaveis como codigo,nome endereco,cep bairro depois

    de lido gravar isto dentro de um outro arquivo alguem tem uma ideia como ler e gravar isto

    obrigado

    fwh 14.02 xharbour 123 dbf xdev

    carlos

  7. oi pessoal boa tarde

    olha o exemplo abaixo

    a=1000.00

    b=200.00

    c=-100.00

    if a > 0

    que e,ai ele mente ele diz que nao e

    endif

    if b=0.00

    dele diz que .f.

    endif

    d= a-b

    if d > 0

    ele fala que e .f.

    endif

    o program esta com 9000 mil linhas

    sera e porque o programa e muito grande ?

    a unica forma que achei para dar certo foi fazendo assim com exemplo abaixo

    if ltrim(str(d,12,2)) > "0.00"

    babababa

    endif

    e estranho porque e fator matematico,

    estou usando 2 casas decimais

    isto e erro xharbour ?

    obrigado a todos

    carlos

    fwh13.02 xharbour 123 dbf xdev

  8. ola pessoal bom dia

    o pepino e o seguinte

    fator de calculo a,b

    a= 3000.00

    b=igual a soma

    soma de b

    b=1000.00 primeira vez

    b=1000.00 segunda

    b=1000.00 terceira

    vc fiz um if na programacao para verificar se o valor de b e > que o valor a

    ele diz que sim e na verdade sao iguais

    isto na programacao foi com um get, clipper ele responde corretamento com blinker,exospace

    mais xbarbour ele mente;. e bug do xharbour

    obrigado carlos

    fwh 13.02 xharbour 1.2.3 dbf ,xdev

×
×
  • Create New...