Maravilloso. Muy bien.
Maravilloso. Muy bien.
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
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
Esta versi贸n tambi茅n ve los ficheros dentro de un .zip
nRet := ShellExecute( GetWndApp(), ,cFile, ,cFilePath( cFile ), SW_SHOW )Carles
Yo he entendido que necesita mostrar el pdf dentro de un "control" en su aplicaci贸n, y no en una ventana externa
#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 NILGracias 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.
Fernando,
Entiendo
. 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
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.
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...
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.
#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:nHeight,0 XBROWSE oBrw SIZE nWBrw, -oWnd: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: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
//----------------------------------------------------------------------------//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?
Chrome MFC ...
https://github.com/VladimirRybakov/cef-mfc
m谩s cerca aun! Un control TCef no estaria mal ![]()