Incrustar otra aplicación
- Sebastián Almirón
- Posts: 159
- Joined: Mon Dec 12, 2005 9:56 am
- Location: Moralzarzal - Spain
Incrustar otra aplicació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.
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.
- Sebastián Almirón
- Posts: 159
- Joined: Mon Dec 12, 2005 9:56 am
- Location: Moralzarzal - Spain
Re: Incrustar otra aplicació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
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
- Sebastián Almirón
- Posts: 159
- Joined: Mon Dec 12, 2005 9:56 am
- Location: Moralzarzal - Spain
Re: Incrustar otra aplicació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.
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
Muchas gracias Sebastián se ve muy interesante
Saluditos![Wink :wink:](./images/smilies/icon_wink.gif)
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
Saluditos
![Wink :wink:](./images/smilies/icon_wink.gif)
Que es mejor que programar? creo que nada ![Smile :)](./images/smilies/icon_smile.gif)
Atropellada pero aqui ando![Razz :P](./images/smilies/icon_razz.gif)
I love Fivewin
séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
![Smile :)](./images/smilies/icon_smile.gif)
Atropellada pero aqui ando
![Razz :P](./images/smilies/icon_razz.gif)
I love Fivewin
séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
Re: Incrustar otra aplicación
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,
Oscar Ribeiro
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,
Oscar Ribeiro
Oscar Ribeiro
OASyS Informática
Fwh18.02 + xHarbour 1.2.3 + Bcc72
OASyS Informática
Fwh18.02 + xHarbour 1.2.3 + Bcc72
- Patricio Avalos Aguirre
- Posts: 1060
- Joined: Fri Oct 07, 2005 1:56 pm
- Location: La Serena, Chile
- Contact:
Re: Incrustar otra aplicación
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?
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?
Saludos
Patricio
__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Patricio
__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Re: Incrustar otra aplicación
¿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.
Gracias.
Oscar Ribeiro
OASyS Informática
Fwh18.02 + xHarbour 1.2.3 + Bcc72
OASyS Informática
Fwh18.02 + xHarbour 1.2.3 + Bcc72
- Vikthor.Thomas
- Posts: 144
- Joined: Thu Jan 02, 2014 1:49 pm
Re: Incrustar otra aplicación
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
- joseluisysturiz
- Posts: 2064
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: Incrustar otra aplicación
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... ![Shocked :shock:](./images/smilies/icon_eek.gif)
![Shocked :shock:](./images/smilies/icon_eek.gif)
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
- Vikthor.Thomas
- Posts: 144
- Joined: Thu Jan 02, 2014 1:49 pm
Re: Incrustar otra aplicación
DLL32 FUNCTION SETFOREWIN() AS LONG PASCAL FROM "SetForeWin" LIB "user32.dll"
DLL32 FUNCTION SETWINLONA() AS LONG PASCAL FROM "SetWinLona" LIB "user32.dll"
DLL32 FUNCTION SETWINLONA() AS LONG PASCAL FROM "SetWinLona" LIB "user32.dll"
- Marcelo Roggeri
- Posts: 342
- Joined: Sat Jul 22, 2006 9:04 pm
- Location: Venado Tuerto - Santa Fe -Argentina
- Contact:
Re: Incrustar otra aplicación
Hola buenas tardes, se puede hacer esto mismo con Word ?
Saludos
Saludos
FWH - Harbour - BCC7 - PellesC