Objetos embebidos
Objetos embebidos
Además de _IECreateEmbedded que permite embeber el navegador dentro de una ventana de Autoit, ¿se pueden embeber otro tipo de objetos como por ejemplo una hoja de Excel?
Traté de hacerlo adaptando la función anterior a un objeto Excel (así, a lo bruto, y por descartar lo fácil) y no conseguí embeberlo...claro!
En el Help (obj/COM Reference) creo que se describe el procedimiento para llevarlo a cabo, pero se me hace inabordable.
¿Alguien puede aportar algo más de info sobre el tema u otro ejemplo de embeded?
Traté de hacerlo adaptando la función anterior a un objeto Excel (así, a lo bruto, y por descartar lo fácil) y no conseguí embeberlo...claro!
En el Help (obj/COM Reference) creo que se describe el procedimiento para llevarlo a cabo, pero se me hace inabordable.
¿Alguien puede aportar algo más de info sobre el tema u otro ejemplo de embeded?
Re: Objetos embebidos
Pues que yo sepa no... estan las librerias para el uso de EXEL, pero precisamente para embed no eh visto :O ..
EDITO: estuve viendo esto y si podes proba esto :O dentro del gui obvio
yo no tengo el exel instalado asik no puedo,
$oExcel = ObjCreate("Excel.Application")
Guictrlcreateobj( $oExcel, x,y...)
EDITO: estuve viendo esto y si podes proba esto :O dentro del gui obvio
yo no tengo el exel instalado asik no puedo,
$oExcel = ObjCreate("Excel.Application")
Guictrlcreateobj( $oExcel, x,y...)
Aunk no m Buskes, Seguro m enkontras!
Re: Objetos embebidos
Sii, un monton de objetos mas.. obvio k si son comparivlwes, si sabes las funcioens, etc. uno lindo va, me parece util es el del WMP, pero si te fijas, cuando kreas un Formulario con Koda, existe un control para kkrear un objeto com!, revisa eso k segun tengas instalado te saldra una extensa lista de Obj....joaquin escribió: ¿se pueden embeber otro tipo de objetos como por ejemplo una hoja de Excel?
Aunk no m Buskes, Seguro m enkontras!
Re: Objetos embebidos
Gracias. Con el Koda he podido conseguir algo, que aunque no es Excel Embebido, utiliza un objeto de Web Components, que queda incrustado en el GUI,y utiliza una tabla que se puede exportar a Excel.
Código: Seleccionar todo
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 633, 447, 219, 145)
$Obj1 = ObjCreate("OWC11.Spreadsheet.11")
$Obj1_ctrl = GUICtrlCreateObj($Obj1, 24, 16, 576, 392)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Re: Objetos embebidos
dejo la imagen de como resulta:
- Adjuntos
-
- ObjectEmbeded.JPG (40.91 KiB) Visto 4668 veces
Re: Objetos embebidos
Sí, todo sirve , sobretodo para aprender . A ver, en sentido estricto no se ha embebido una hoja de Excel directamente y diria que no se pueden aplicar las UDF's de Excel al ejemplo anterior, pero si se ha conseguido incrustar una tabla con funciones bàsicas de ordenamiento/ filtrado y exportable a Excel. Bueno sin ser la solución final, hemos avanzado algo.
De todas formas, el planteamiento es más general, y referido al método para embeber cualquier otro programa (además de IE)
En mi caso me lo planteé a partir de lo siguiente: El usuario rellena un cuestionario en Infopath, que ya me exporta los valores a Excel, y quería que sólo se pudiera tener acceso a la tabla pero no a las barras de herramientas y demás (para que no anden desconfigurando todo) por lo que pensé en la posibilidad de incrustar la hoja en la GUI.
En conclusión, sirvió pero no queda resuelta la duda planteada.
Saludos...
De todas formas, el planteamiento es más general, y referido al método para embeber cualquier otro programa (además de IE)
En mi caso me lo planteé a partir de lo siguiente: El usuario rellena un cuestionario en Infopath, que ya me exporta los valores a Excel, y quería que sólo se pudiera tener acceso a la tabla pero no a las barras de herramientas y demás (para que no anden desconfigurando todo) por lo que pensé en la posibilidad de incrustar la hoja en la GUI.
En conclusión, sirvió pero no queda resuelta la duda planteada.
Saludos...
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Objetos embebidos
¡Impresionante la tablita!...
¿Y eso objeto OWC11.Spreadsheet.11 está en todos los Windows?
En principio ObjCreate puede insertar cualquier objeto COM compatible, así que si hay un COM para las hojas Excel pues deberían poder insertarse...
Además está ObjGet, que conecta a un proceso creado en el sistema.
Por lo que veo, AutoIT puede conectarse sólo a los objetos que tengan una interfaz IDispatch, pues la utiliza para comunicarse con el objeto...
Hay otra limitación con eventos COM que usen parámetros pasados por referencia, como AutoIT usa su sistema de variables las pasa por valor.
A parte de eso no debería haber problemas.
Respecto a Excel.... mira lo que he encontrado en la ayuda, en "COM Extensions to AutoIt"
¿Te funciona? ¿no es lo que quieres?
¿Y eso objeto OWC11.Spreadsheet.11 está en todos los Windows?
En principio ObjCreate puede insertar cualquier objeto COM compatible, así que si hay un COM para las hojas Excel pues deberían poder insertarse...
Además está ObjGet, que conecta a un proceso creado en el sistema.
Por lo que veo, AutoIT puede conectarse sólo a los objetos que tengan una interfaz IDispatch, pues la utiliza para comunicarse con el objeto...
Hay otra limitación con eventos COM que usen parámetros pasados por referencia, como AutoIT usa su sistema de variables las pasa por valor.
A parte de eso no debería haber problemas.
Respecto a Excel.... mira lo que he encontrado en la ayuda, en "COM Extensions to AutoIt"
Código: Seleccionar todo
$oExcel = ObjCreate("Excel.Application") ; Create an Excel Object
$oExcel.Visible = 1 ; Let Excel show itself
$oExcel.WorkBooks.Add ; Add a new workbook
$oExcel.ActiveWorkBook.ActiveSheet.Cells(1,1).Value="test" ; Fill a cell
sleep(4000) ;See the results for 4 seconds
$oExcel.ActiveWorkBook.Saved = 1 ; Simulate a save of the Workbook
$oExcel.Quit ; Quit Excel
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Re: Objetos embebidos
Gracias por el aporte...
OWC11.Spreadsheet.11 viene en Office 2003. Por defecto en XP viene OWC10.Spreadsheet.10.
Puedes comprobar con: Koda>Win32>Object COM.
Los parámetros que posteas añaden funcionalidad a ObjCreate/ObjGet, por tanto son muy útiles para manejar las tablas, pero creo que no resuelve como embeber, incrustar un ObjCreate/ObjGet en la GUI.
Pongo un "ejemplo gráfico" de cómo tendria que resultar lo que planteo:
OWC11.Spreadsheet.11 viene en Office 2003. Por defecto en XP viene OWC10.Spreadsheet.10.
Puedes comprobar con: Koda>Win32>Object COM.
Los parámetros que posteas añaden funcionalidad a ObjCreate/ObjGet, por tanto son muy útiles para manejar las tablas, pero creo que no resuelve como embeber, incrustar un ObjCreate/ObjGet en la GUI.
Pongo un "ejemplo gráfico" de cómo tendria que resultar lo que planteo:
- Adjuntos
-
- Excel1.JPG (70.08 KiB) Visto 4640 veces
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Objetos embebidos
Hace muchos años programé mucho con vba para excel.....habeis tenido suerte (a veces pienso....hay algo que yo no haya tocado???? ).
He cogido el código de la hoja excel incrustada en el foro de habla inglesa para ahorrarme el tener que implementar eso también (tampoco era tanto trabajo ), pero las 3 lineas que quitan las barras son totalmente mías .
Podeis hacer cualquier cosa con el excel, sus libros, sus hojas, etc etc utilizando sus propiedades, eventos, etc..... Mirar en la ayuda de cuando os meteis en macros de visual basic del excel. Digamos que es como si tuvieseis un nuevo lenguaje .
Si teneis alguna duda en hacerle algo a las hojas, celdas, limitarlo, bloquearlo, cambiar color, etc etc etc desde AutoIt, preguntarme.
Saludos.
He cogido el código de la hoja excel incrustada en el foro de habla inglesa para ahorrarme el tener que implementar eso también (tampoco era tanto trabajo ), pero las 3 lineas que quitan las barras son totalmente mías .
Código: Seleccionar todo
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;~ $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
$FileName=@ScriptDir & "\libro1.xls"
if not FileExists($FileName) then
Msgbox (0,"Excel File Test","Can't run this test, because it requires an Excel file in "& $FileName)
Exit
endif
$oExcel = ObjGet($FileName) ; Get an Excel Object from an existing filename
if IsObj($oExcel) then
; Create a simple GUI for our output
$gui=GUICreate ( "Embedded ActiveX Test", 640, 580, (@DesktopWidth-640)/2, (@DesktopHeight-580)/2 , $WS_OVERLAPPEDWINDOW + $WS_CLIPCHILDREN )
$GUI_ActiveX= GUICtrlCreateObj($oExcel,10, 10 , 600 , 300 )
$numBarras=$oExcel.commandbars.count ;número de barras de herramientas que tiene el excel.
For $n=1 To $numBarras
$oExcel.commandbars($n).enabled=False ;recorro todas la barras de herramientas y las deshabilito ;).
Next
GUISetState () ;Show GUI
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
Wend
GUIDelete ()
$oExcel.Close ; Close the Excel workbook
EndIf
Exit
; This is my custom error handler
Func MyErrFunc()
;~ $HexNumber=hex($oMyError.number,8)
;~ Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
;~ "err.description is: " & @TAB & $oMyError.description & @CRLF & _
;~ "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
;~ "err.number is: " & @TAB & $HexNumber & @CRLF & _
;~ "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
;~ "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
;~ "err.source is: " & @TAB & $oMyError.source & @CRLF & _
;~ "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
;~ "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
;~ )
;~ SetError(1) ; to check for after this function returns
Endfunc
Si teneis alguna duda en hacerle algo a las hojas, celdas, limitarlo, bloquearlo, cambiar color, etc etc etc desde AutoIt, preguntarme.
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Objetos embebidos
Perdonad, se me olvidaba decir que yo he trabajado con un archivo excel en el path del script llamado libro1.xls.
Eso lo tendreis que cambiar por el vuestro aquí>
Saludos.
Eso lo tendreis que cambiar por el vuestro aquí>
Código: Seleccionar todo
$FileName=@ScriptDir & "\libro1.xls"
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: Objetos embebidos
Gracias Chefito, justo lo que planteaba...
Incrustar la tabla y además que no aparezcan las barras. Muy buenas las 3 líneas, les sacaremos provecho... Por cierto que no sólo no muestra las barras dentro del Script, sinó que cuando sales de él y abres un .xls, tampoco aparecen las barras de herramientas....genial!
Además sólo cambiando la extensión de archivo, de .xls a .doc, te incrusta el word. No entiendo porqué pero no funciona con .mdb de acces, ni .xsn de Infopath. En principio tendría que resultar igual ¿no?.
Otra duda que me surge es porqué sólo funciona con ObjGet y no he podido hacer lo mismo con ObjCreate. Si cambio la linea de tu code: $oExcel = ObjGet($FileName) por $oExcel = ObjCreate("Excel.Application") no funciona
Saludos
Incrustar la tabla y además que no aparezcan las barras. Muy buenas las 3 líneas, les sacaremos provecho... Por cierto que no sólo no muestra las barras dentro del Script, sinó que cuando sales de él y abres un .xls, tampoco aparecen las barras de herramientas....genial!
Además sólo cambiando la extensión de archivo, de .xls a .doc, te incrusta el word. No entiendo porqué pero no funciona con .mdb de acces, ni .xsn de Infopath. En principio tendría que resultar igual ¿no?.
Otra duda que me surge es porqué sólo funciona con ObjGet y no he podido hacer lo mismo con ObjCreate. Si cambio la linea de tu code: $oExcel = ObjGet($FileName) por $oExcel = ObjCreate("Excel.Application") no funciona
Saludos
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Objetos embebidos
De nada .
Sí, funciona con word porque lo que hace objget es devolver la referencia a un objeto com a partir de un fichero o proceso. Por eso si lo cambias a un fichero word, engancha la referencia al objeto com de word. Esto pasaría con muchos más archivos a los que se pudiese referenciar un objeto com.
En el código que he puesto, cuando recupero el nombre o el interface del objeto con objname me devuelve _Workbook (El libro de trabajo de Excel). Este nombre pertenecería a la creacción de otro objeto distinto. Este se crearía de esta forma: ObjCreate("Excel.Sheet"). Esto si se insertaría. Yo creo que esto se inserta porque creas un objeto libro de trabajo. En cambio, con ObjCreate("Excel.Application") devuelve _Application (La aplicación excel). Y como llamas a toda la aplicación, esta no es insertable. Lo que haces es abrir la aplicación.
Todo esto es pura congetura mía. En realidad no estoy documentado en esto.
Si os parece más correcto podeis hacer lo mismo de esta forma:
El resultado es el mismo, pero llamais directamente al objeto adecuado (para poder insertarlo en la gui). Puede que sea más correcto para que no se cuele ningún otro objeto....como un objeto word.
Para información, a un objeto word le pasa lo mismo. Puedes crear createobj("word.basic") y createobj("word.application")....creo que era así. Con vba de word he trabajado mucho menos.
Y porque no se puede hacer estas cosas con bbdd??? Pues si te digo la verdad nunca se me ha pasado por la cabeza insertar algo de access. No se nada sobre ese tema. Pero te digo una cosa, las bases de datos se suelen crear con programas como por ejemplo el access, y una vez creadas (la estructura) se suele conectase por código con ellas y trabajar directamente por código. Eso es un mundo a parte bastante extenso.
Yo he trabajado hace años mucho con access y conexión a la bbdd por ado. También lo hice con dao, pero esta muy desfasado. Bueno......no me voy a meter en este tema que como he dicho antes es un mundo aparte.
Bueno, espero haber enseñado hoy algo .
Saludos.
Sí, funciona con word porque lo que hace objget es devolver la referencia a un objeto com a partir de un fichero o proceso. Por eso si lo cambias a un fichero word, engancha la referencia al objeto com de word. Esto pasaría con muchos más archivos a los que se pudiese referenciar un objeto com.
En el código que he puesto, cuando recupero el nombre o el interface del objeto con objname me devuelve _Workbook (El libro de trabajo de Excel). Este nombre pertenecería a la creacción de otro objeto distinto. Este se crearía de esta forma: ObjCreate("Excel.Sheet"). Esto si se insertaría. Yo creo que esto se inserta porque creas un objeto libro de trabajo. En cambio, con ObjCreate("Excel.Application") devuelve _Application (La aplicación excel). Y como llamas a toda la aplicación, esta no es insertable. Lo que haces es abrir la aplicación.
Todo esto es pura congetura mía. En realidad no estoy documentado en esto.
Si os parece más correcto podeis hacer lo mismo de esta forma:
Código: Seleccionar todo
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;~ $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
$oExcel = ObjCreate("Excel.sheet") ; Get an Excel Object from an existing filename
if IsObj($oExcel) then
; Create a simple GUI for our output
$gui=GUICreate ( "Embedded ActiveX Test", 640, 580, (@DesktopWidth-640)/2, (@DesktopHeight-580)/2 , $WS_OVERLAPPEDWINDOW + $WS_CLIPCHILDREN )
$FileName=@ScriptDir & "\libro1.xls"
if not FileExists($FileName) then
Msgbox (0,"Excel File Test","Can't run this test, because it requires an Excel file in "& $FileName)
Exit
endif
$oExcel.application.WorkBooks.open(@ScriptDir & "\libro1.xls")
$GUI_ActiveX= GUICtrlCreateObj($oExcel,10, 10 , 600 , 300 )
$numBarras=$oExcel.commandbars.count ;número de barras de herramientas que tiene el excel.
For $n=1 To $numBarras
$oExcel.commandbars($n).enabled=False ;recorro todas la barras de herramientas y las deshabilito ;).
Next
GUISetState () ;Show GUI
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
Wend
GUIDelete ()
$oExcel.Close ; Close the Excel workbook
EndIf
Exit
; This is my custom error handler
Func MyErrFunc()
;~ $HexNumber=hex($oMyError.number,8)
;~ Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
;~ "err.description is: " & @TAB & $oMyError.description & @CRLF & _
;~ "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
;~ "err.number is: " & @TAB & $HexNumber & @CRLF & _
;~ "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
;~ "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
;~ "err.source is: " & @TAB & $oMyError.source & @CRLF & _
;~ "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
;~ "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
;~ )
;~ SetError(1) ; to check for after this function returns
Endfunc
Para información, a un objeto word le pasa lo mismo. Puedes crear createobj("word.basic") y createobj("word.application")....creo que era así. Con vba de word he trabajado mucho menos.
Y porque no se puede hacer estas cosas con bbdd??? Pues si te digo la verdad nunca se me ha pasado por la cabeza insertar algo de access. No se nada sobre ese tema. Pero te digo una cosa, las bases de datos se suelen crear con programas como por ejemplo el access, y una vez creadas (la estructura) se suele conectase por código con ellas y trabajar directamente por código. Eso es un mundo a parte bastante extenso.
Yo he trabajado hace años mucho con access y conexión a la bbdd por ado. También lo hice con dao, pero esta muy desfasado. Bueno......no me voy a meter en este tema que como he dicho antes es un mundo aparte.
Bueno, espero haber enseñado hoy algo .
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Re: Objetos embebidos
Gracias por ampliar la info...Sí fue muy instructivo .