Page 1 of 1

Incrustar otra aplicación

Posted: Tue Mar 01, 2011 5:45 pm
by Sebastián Almirón
Hola, a ver si alguien me puede ayudar.

Estoy haciendo una aplicación que necesita tener un control exaustivo sobre excel. Cosas como quitar parte de los menús de Excel, añadirles otros nuevos, cargarle un fichero xla con multitud de funciones escritas en VB, etc. Mi aplicación se encarga de todo lo referente a abrir, guardar y cerrar los libros.

El caso es que ya tengo todo hecho y funcionando, pero necesito que excel se abra dentro de la ventana de mi aplicación y no como una ventana independiente.

He intentado con ActiveX pero no lo he conseguido (entre otras cosas necesito un objeto Excel.Application y no un OWC11.Spreadsheet).

Al final he intentado así:

hWndexcel := FindWindow(0,"Microsoft Excel - "+cfilenopath(clibro))
SetParent(hwndexcel,oWnd:hWnd) // Muestra Excel en la ventana de mi aplicación

Con esto excel permanece dentro de la ventana de mi aplicación, pero los dialogos que debería desplegar excel cuando se selecciona alguna opción de su menú, no se muestran y en su lugar la ventana excel se queda parpadeando, la opción del menú de excel seleccionada en naranja y excel deja de responder. Excel lo manejo con OLE.

Mi pregunta es si esto es posible o estoy desvariando.

Re: Incrustar otra aplicación

Posted: Wed Mar 02, 2011 5:13 pm
by Sebastián Almirón
Pues nada, ya lo he solucionado:

oexcelsolver :=CreateObject( "Excel.Application" )
oexcelsolver:Workbooks:Open(clibro)
sysrefresh()
oexcelsolver:Visible(.t.)
hWndexcel := FindWindow(0,"Microsoft Excel - "+cfilenopath(clibro))
SetParent(hwndexcel,oWnd:hWnd)

Con CreateOleObject("Excel.Application") no funcionaban las opciones en las que excel abre un dialogo y se quedaba colgado, entre ellas mis funciones.
Así funciona bien y excel no se sale de la ventana de mi aplicación.

Saludos

Re: Incrustar otra aplicación

Posted: Fri Mar 04, 2011 3:00 pm
by Sebastián Almirón
Por si alguien está interesado, después de repasar todo un poco ha quedado así:

oexcelsolver := CreateObject( "Excel.Application" )
oexcelsolver:WorkBooks:Open(clibro)
sysrefresh()
SetWinLonA(oexcelsolver:hWnd,-16,"L") //Es la función API SetWindowLongA, en este caso quita la barra de titulo de excel
SetForeWin(oexcelsolver:hWnd) //Es la funcion API SetForegroundWindow tiene que ir antes de la llamada a setparent()
SetParent(oexcelsolver:hWnd,oWnd:hWnd) //Incrusta Excel en mi ventana

oWnd:SetText( cverotc + ' - Libro abierto: '+clibro )
oexcelsolver:ActiveWorkBook:Protect('',.f.,.f.) //Para poder manupilar el estado de la venta del libro
oexcelsolver:WindowState(-4137) //Se quitan los botones de maximizar, minimizar y cerrar
oexcelsolver:Windows(1):WindowState(-4137) //Se maximiza Excel en mi ventana
oexcelsolver:Visible(.t.) //Hace Excel visible

Con esto el resultado es el que debería tener con TActiveX, pero con esa clase no he conseguido hacer rular Excel sin errores.

Re: Incrustar otra aplicación

Posted: Sat Mar 05, 2011 5:11 pm
by AIDA
Muchas gracias Sebastián se ve muy interesante :mrgreen:

Saluditos :wink:

Re: Incrustar otra aplicación

Posted: Fri Apr 15, 2011 1:16 pm
by ORibeiro
Donde encontro las funciones:
SetWinLonA(oexcelsolver:hWnd,-16,"L") //Es la función API SetWindowLongA, en este caso quita la barra de titulo de excel
SetForeWin(oexcelsolver:hWnd) //Es la funcion API SetForegroundWindow tiene que ir antes de la llamada a setparent()
Gracias,
_ Ribeiro

Re: Incrustar otra aplicación

Posted: Fri Apr 15, 2011 2:04 pm
by Patricio Avalos Aguirre
Sebastian:

Muy interesante, pero por ahora no he tenido ninguna solicitud en hacer eso, si que se queda guardado el las cosas interensante por aplicar

podrias colocar algunas imagenes para poder ver mejor?

Re: Incrustar otra aplicación

Posted: Fri Apr 15, 2011 4:12 pm
by ORibeiro
¿Cómo puedo hacer que Excel ejecute por completo dentro de la aplicación? Con todas sus funciones. Lo pregunto porque, tal y como está, no puedo imprimir, escribir o modificar una hoja de cálculo.
Gracias.

Re: Incrustar otra aplicación

Posted: Thu Jul 10, 2014 9:03 pm
by Vikthor.Thomas
ORibeiro wrote:¿Cómo puedo hacer que Excel ejecute por completo dentro de la aplicación? Con todas sus funciones. Lo pregunto porque, tal y como está, no puedo imprimir, escribir o modificar una hoja de cálculo.
Gracias.

Utilizando FWH64.1311 , Visual Studio 2012 y Ofiice 2013 consigo incrustar la ventana de Excel dentro de una MDIChild, y lo único que NO es posible realizar es la edición de las celdas.

Alguna sugerencia.

Saludos

Re: Incrustar otra aplicación

Posted: Fri Jul 11, 2014 3:01 am
by joseluisysturiz
Muy buena informacion para los que manejamos mucho la exportacion a excel, como comentan algunos colegas, ahora la idea es que se ejecute dentro de una MDI y si es posible como un reporte normal, quitando todo lo posible, saludos... :shock:

Re: Incrustar otra aplicación

Posted: Tue Jul 22, 2014 8:56 pm
by Vikthor.Thomas
Listo el pollo !!! :-)

Re: Incrustar otra aplicación

Posted: Sun Aug 28, 2016 8:56 pm
by MGA
DLL32 FUNCTION SETFOREWIN() AS LONG PASCAL FROM "SetForeWin" LIB "user32.dll"
DLL32 FUNCTION SETWINLONA() AS LONG PASCAL FROM "SetWinLona" LIB "user32.dll"

Re: Incrustar otra aplicación

Posted: Tue Oct 04, 2016 9:38 pm
by Marcelo Roggeri
Hola buenas tardes, se puede hacer esto mismo con Word ?
Saludos