Page 2 of 5

Re: Ver PDF dentro de la aplicación

Posted: Tue Jun 14, 2016 1:02 pm
by karinha
Maravilloso. Muy bien.

Re: Ver PDF dentro de la aplicación

Posted: Wed Jun 15, 2016 10:02 am
by fgondi
Hola,

Estoy probando el ejecutable que has enviado, con un pdf de 302KB con 2 hojas, y no se vé. aparece el cuadro dentro de la clase tRichEdit5, pero no carga el pdf

Re: Ver PDF dentro de la aplicación

Posted: Wed Jun 15, 2016 11:15 am
by cnavarro
fgondi wrote:Hola,

Estoy probando el ejecutable que has enviado, con un pdf de 302KB con 2 hojas, y no se vé. aparece el cuadro dentro de la clase tRichEdit5, pero no carga el pdf
Fernando
Construye el ejecutable con el source que he puesto y prueba de nuevo
Yo lo he probado con PDFs más grandes

Si tienes algún problema envíame un correo

Re: Ver PDF dentro de la aplicación

Posted: Thu Jun 16, 2016 8:17 am
by cnavarro
Esta versión también ve los ficheros dentro de un .zip

https://bitbucket.org/fivetech/fivewin- ... explor.exe

Re: Ver PDF dentro de la aplicación

Posted: Thu Jun 16, 2016 12:04 pm
by Carles
Fernando,

Y porque no se encarga Windows de buscar el programa que tenga cada uno configurado ?

Code: Select all

    nRet := ShellExecute( GetWndApp(), ,cFile, ,cFilePath( cFile ), SW_SHOW )

Re: Ver PDF dentro de la aplicación

Posted: Thu Jun 16, 2016 6:12 pm
by cnavarro
Carles

Yo he entendido que necesita mostrar el pdf dentro de un "control" en su aplicación, y no en una ventana externa

Re: Ver PDF dentro de la aplicación

Posted: Fri Jun 17, 2016 6:56 am
by Carles
Vale,

Pues prueba con esto para jugar un poco con el tema...

Code: Select all

#include 'fivewin.ch'

#define SW_SHOW 5
#define SW_HIDE 0

STATIC oWnd

*--------------
FUNCTION MAIN()
*--------------
    
    DEFINE WINDOW oWnd MDI 
    ACTIVATE WINDOW oWnd ON INIT Test()
    
RETU NIL

*--------------
FUNCTION Test()
*-------------- 
    LOCAL cFile     := 'manual.pdf'
    LOCAL nRet      := ShellExecute( oWnd:hWnd, ,cFile, ,cFilePath( cFile ), SW_HIDE )
    LOCAL hWndPdf
    
    SysWait(1)
    
    hWndPdf := FindWindow(0, cFile + " - Adobe Reader" )        

    SetParent( hWndPdf, oWnd:hWnd ) 

RETU NIL

Re: Ver PDF dentro de la aplicación

Posted: Mon Jun 20, 2016 8:58 am
by fgondi
Gracias Carles por la información,

Ese sistema ya lo había probado (en concreto para capturar una excel), pero provoca problemas.

1.- Si ya está abierta la aplicación externa, captura toda ella. Por tanto el documento que estuviese viendo, externo a mi aplicación, también quedaría capturado dentro de mi aplicación.

2º.- Si no está abierto, parece que funciona bien, hasta que intenta abrir un documento externo a mi aplicación, sin haber cerrado la captura generada. Este documento externo se abre dentro de mi aplicación.

De nuevo muchas gracias Carles.

Seguiré trabajando con la opción de Cristobal.

Re: Ver PDF dentro de la aplicación

Posted: Tue Jun 21, 2016 6:06 am
by Carles
Fernando,

Entiendo :D . Y has probado de usar activex con el shell.explorer ? Esto seguro te funciona y solo tendrias de crear un html de 4 lineas para leer tus pdf's. La ventaja de usar shell.explorer es que seguro q esta en todos los ordenadores de tus clientes, otros activex ya implica gestión de si existe o no. Si necesitas un ejemplo te lo publico

Re: Ver PDF dentro de la aplicación

Posted: Tue Jun 21, 2016 8:28 am
by fgondi
Carles,

Usar el activex del Explorer fue mi primera opción.
En versiones mas modernas del navegador, se abren directamente los pdf. En las antiguas no, pero, tal y como dices, con 4 líneas de código se puede forzar a que las abra.

El navegador usa internamente el activex de acrobat (si está instalado) y sería la opción perfecta.

Sin embargo, tengo otros problemas, que estoy intentando resolver, que me obligan a ejecutar las aplicaciones con "Compatibilidad para XP" y al ejecutarse con esa compatibilidad no cargan los pdf's.

Re: Ver PDF dentro de la aplicación

Posted: Tue Jun 21, 2016 12:16 pm
by Carles
Fernando,

Para XP no se como poder hacerlo via activex :( . Ya contaras... (Yo si son casos puntuales como dices, chequearia la version win que usas y si es XP lanzaria un winexec() y sino via activex empotrado en la app)

Ya contaras como te has salido...

Re: Ver PDF dentro de la aplicación

Posted: Thu Jun 23, 2016 8:12 am
by HunterEC
Cristobal:

Excelente programa. Muy profesional. Tiene un pequeño "bug" cuando escoges del menu un tipo de fichero y no hay de ellos, se cancela con un error.

Re: Ver PDF dentro de la aplicación

Posted: Thu Jun 23, 2016 10:34 am
by cnavarro
Solucionado, gracias

https://bitbucket.org/fivetech/fivewin- ... explor.exe

Code: Select all


#include "fivewin.ch"
#include "RichEdi5.ch"

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

REQUEST HB_CODEPAGE_ESWIN

Static oRTF
Static cRTF
Static nFilter
Static cDirName
Static aFilesTxt
Static aFilesImg
Static aFilesObj
Static aFilesAll

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

function Main()

   local aImages
   local oWnd
   local oFont
   local oBrush
   local oBrw
   local nWBrw   := 300

   FW_SetUnicode( .t. )
   HB_CDPSELECT( "ESWIN" )
   HB_SETCODEPAGE( "UTF8" ) // Harbour (not xHarbour) to display unicode filenames

   aFilesTxt := { "RTF", "ZIP", "TXT", "PRG", "C", "CPP", "H", "CH", "RC", "INI", "BAT", "MAK", "XML", "LOG", "PPO" }
   aFilesImg := { "BMP", "PNG", "JPG", "ICO", "DIB", "PCX", "GIF", "WMF" }
   aFilesObj := { "DOC", "XLS", "PPT", "PDF", "DOCX", "XLSX" }
   aFilesAll := { "DBF" }

   //ReadDir()
   
   nFilter  := 0
   cDirName := hb_CurDrive() + ":\" + CurDir()
   aImages  := ReadFolder()

   DEFINE FONT oFont NAME "VERDANA" SIZE 0,-14
   //DEFINE BRUSH oBrush FILE "..\bitmaps\backgrnd\stone.bmp"
   
   DEFINE WINDOW oWnd TITLE " FWExplorer: Visor de Documentos - [ TRichEdit Control ]"
   oWnd:SetFont( oFont )
   
   SET MESSAGE OF oWnd TO "" 2015
   DEFINE BUTTONBAR oWnd:oBar SIZE 70, 32 2015

   DEFINE BUTTON OF oWnd:oBar PROMPT "Exit"   CENTER ACTION ( oWnd:End() )   
   DEFINE BUTTON OF oWnd:oBar PROMPT "Rtf"    CENTER ACTION ( nFilter := 1, ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Text"   CENTER ACTION ( nFilter := 11, ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Images" CENTER ACTION ( nFilter := 2 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Object" CENTER ACTION ( nFilter := 3 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Dbf"    CENTER ACTION ( nFilter := 4 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "All"    CENTER ACTION ( nFilter := 0 , ;
          oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )
   DEFINE BUTTON OF oWnd:oBar PROMPT "Folder" CENTER ;
      ACTION ( cDirName := cGetDir( "Select Folder", GetCurDir() + "\" ), ;
               SetCurDir( cDirName ), ;
               oBrw:aArrayData := ReadFolder(), oBrw:Refresh( .t. ), VerDoc( oBrw ) )

   @ oWnd:oBar:nHeight,0 XBROWSE oBrw SIZE nWBrw, -oWnd:oMsgBar:nHeight ;
      PIXEL OF oWnd DATASOURCE aImages COLUMNS 1 CELL LINES NOBORDER

   WITH OBJECT oBrw
      :l2007 := .F.
      :aCols[ 1 ]:cHeader := "Files"
      :nStretchCol   := 1
      :bChange       := { | o | VerDoc( o ) }
      :bLDblClick    := { | o | LookOthers( oBrw ) }
      :bClrStd       := { || { If( oBrw:aRow[ 3 ] == 1, CLR_BLUE, CLR_HRED ), CLR_WHITE } }
      :bKeyDown      := { |n,f| if( n = VK_RETURN, Eval( oBrw:bLDblClick ), ) }
      :CreateFromCode()
   END

   WITH OBJECT oWnd
      :nWidth     := ScreenWidth()  * 0.6
      :nHeight    := ScreenHeight() * 0.6
   END

   @ oWnd:oBar:nHeight, nWBrw RICHEDIT5 oRTF VAR cRTF OF oWnd ;
     SIZE oWnd:nWidth - (nWBrw+18), oBrw:nHeight*1.82 PIXEL NOBORDER HSCROLL

   ACTIVATE WINDOW oWnd CENTERED ON INIT VerDoc( oBrw ) ;
   ON PAINT ( oRTF:SetSize( oWnd:nWidth - (nWBrw+18), oBrw:nHeight-2 ) ) //ON INIT oWnd:SetControl( oRTF )
   
   RELEASE FONT oFont
   //RELEASE BRUSH oBrush

return nil

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

Function VerDoc( oBrw )

   local nOpc      := 0
   local lText     := .F.
   //local cFile     := AnsiToWide( AllTrim( oBrw:aRow[ 2 ] ) )
   local cFile     := if( Len( oBrw:aArrayData ) > 0, AllTrim( oBrw:aRow[ 2 ] ), "" )
   local aFiles    := {}
   local cText     := ""
   
   if !Empty( cFile )
      if !Empty( Ascan( aFilesTxt, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
         nOpc  := 1
      endif
      if Empty( nOpc )
         if !Empty( Ascan( aFilesImg, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
            nOpc  := 2
         endif
      endif
      if Empty( nOpc )
         if !Empty( Ascan( aFilesObj, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
            nOpc  := 3
         endif
      endif
      if Empty( nOpc )
         if !Empty( Ascan( aFilesAll, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
            nOpc  := 4
         endif
      endif
   endif
   oRTF:SetClear()
   oRTF:SelectAll()
   oRTF:Del()

   Do Case
      Case nOpc = 0
         lText  := .T.
         oRTF:SetText( "<File Format not supported>" )
      
      Case nOpc = 1

         if Upper( cFileExt( cFile ) ) <> "RTF"
            if Upper( cFileExt( cFile ) ) == "ZIP"         
               aFiles := hb_GetFilesInZip( cFile )
               if !Empty( aFiles )
                  cText  += Upper( cFileNoPath( cFile ) ) + "=> " + CRLF
                  AEVal( aFiles, { | a | cText += Chr( 9 ) + Chr( 9 ) + Chr( 9 ) + a + CRLF } )
                  lText  := .T.
                  oRTF:SetText( cText )
               endif
            else
               lText  := .T.
               oRTF:SetText( MemoRead( cFile ) )
            endif
         else
            oRTF:LoadFromRTFFile( cFile )
         endif
      
      Case nOpc = 2
      
         oRTF:InsertPictureFile( cFile )

      Case nOpc = 3
         
         oRTF:InsertObject( cFile ) //+ Chr( 0 ) )

      Case nOpc = 4
         lText  := .T.
         oRTF:SetText( "<File Format not supported: Double Click or Intro>" )

      Otherwise
      
         oRTF:LoadRTF( cFile )      

   EndCase

Return nil

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

Static Function LookOthers( oBrw )

   local nOpc      := 0
   
   if !Empty( Ascan( aFilesTxt, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
      nOpc  := 1
   endif
   if Empty( nOpc )
      if !Empty( Ascan( aFilesImg, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
         nOpc  := 2
      endif
   endif
   if Empty( nOpc )
      if !Empty( Ascan( aFilesObj, Upper( cFileExt( oBrw:aRow[ 2 ] ) ) ) )
         nOpc  := 3
      endif
   endif
   if Empty( nOpc )
      if Upper( cFileExt( oBrw:aRow[ 2 ] ) ) = "DBF"
         XBrowse( oBrw:aRow[ 2 ] )
      else
         MsgInfo( "Format not supported", oBrw:aRow[ 2 ] )
      endif
   endif

Return nil

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

static function ReadFolder()

   local aImages  := {}
   local aSub     := { "*" }
   local c
   local x
   local cPath    := cDirName
   local aDir
   local aAlls    := {}

   AEVal( aFilesTxt, { | a | AAdd( aAlls, a ) } )
   AEVal( aFilesImg, { | a | AAdd( aAlls, a ) } )
   AEVal( aFilesObj, { | a | AAdd( aAlls, a ) } )
   AEVal( aFilesAll, { | a | AAdd( aAlls, a ) } )

   Do Case
      Case nFilter = 0
           aSub    := { "*" }
      Case nFilter = 1
           aSub    := { "rtf" } 
      Case nFilter = 11
           aSub    := aClone( aFilesTxt )
           aSub    := ADel( aSub, 1 )
           ASize( aSub, Len( aSub ) - 1 )
      Case nFilter = 2
           aSub    := aClone( aFilesImg )
      Case nFilter = 3
           aSub    := aClone( aFilesObj )
      Case nFilter = 4
           aSub    := { "dbf" } 
   EndCase
   
   for each c in aSub
      aDir     := Directory( cPath + "\*." + c )
      AEval( aDir, { | a | AAdd( aImages, { Lower( a[ 1 ] ), ;
                           Lower( TrueName( cPath + "\" + a[ 1 ] ) ), 0 } ) } )
   next
   For x = 1 to Len( aImages )
      if !Empty( Ascan( aAlls, Upper( cFileExt( aImages[ x ][ 2 ] ) ) ) )
         aImages[ x ][ 3 ] := 1
      endif
   Next x
   
   ASort( aImages,,,{ | x, y | Lower( x[ 1 ] ) < Lower( y[ 1 ] ) } )

return aImages

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


Re: Ver PDF dentro de la aplicación

Posted: Fri Jun 24, 2016 8:56 am
by Carlos Mora
Hola a todos,

retomando la solución propuesta por Antonio, y que además serviría para más cosas...

https://bitbucket.org/chromiumembedded/cef

Chrome embebido en las aplicaciones. No es una tarea fácil pero seria más que interesante poder tener un browser tan completo dentro de nuestras aplicaciones, y con su js y todo lo que eso conlleva.

¿Que os parece?

Re: Ver PDF dentro de la aplicación

Posted: Fri Jun 24, 2016 12:01 pm
by Carlos Mora
Chrome MFC ...

https://github.com/VladimirRybakov/cef-mfc

más cerca aun! Un control TCef no estaria mal :)