Objetos embebidos

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Objetos embebidos

Mensaje por joaquin »

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?
Avatar de Usuario
gna08
Hacker del Foro
Mensajes: 379
Registrado: 27 Sep 2008, 18:51
Ubicación: Cordoba, Argentina

Re: Objetos embebidos

Mensaje por gna08 »

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 :smt021 asik no puedo,

$oExcel = ObjCreate("Excel.Application")
Guictrlcreateobj( $oExcel, x,y...)
Aunk no m Buskes, Seguro m enkontras!
Avatar de Usuario
gna08
Hacker del Foro
Mensajes: 379
Registrado: 27 Sep 2008, 18:51
Ubicación: Cordoba, Argentina

Re: Objetos embebidos

Mensaje por gna08 »

joaquin escribió: ¿se pueden embeber otro tipo de objetos como por ejemplo una hoja de Excel?
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.... :smt002
Aunk no m Buskes, Seguro m enkontras!
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Objetos embebidos

Mensaje por joaquin »

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
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Objetos embebidos

Mensaje por joaquin »

dejo la imagen de como resulta:
Adjuntos
ObjectEmbeded.JPG
ObjectEmbeded.JPG (40.91 KiB) Visto 4579 veces
Avatar de Usuario
gna08
Hacker del Foro
Mensajes: 379
Registrado: 27 Sep 2008, 18:51
Ubicación: Cordoba, Argentina

Re: Objetos embebidos

Mensaje por gna08 »

ENtonces sirvio¿ :smt017
Aunk no m Buskes, Seguro m enkontras!
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Objetos embebidos

Mensaje por joaquin »

Sí, todo sirve , :smt045 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...
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Objetos embebidos

Mensaje por Ximorro »

¡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"

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  
¿Te funciona? ¿no es lo que quieres?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Objetos embebidos

Mensaje por joaquin »

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:
Adjuntos
Excel1.JPG
Excel1.JPG (70.08 KiB) Visto 4551 veces
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Objetos embebidos

Mensaje por Chefito »

Hace muchos años programé mucho con vba para excel.....habeis tenido suerte :smt003 (a veces pienso....hay algo que yo no haya tocado???? :smt005 ).
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 :smt005 ), pero las 3 lineas que quitan las barras son totalmente mías :smt002 .

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

 
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 :smt003 .
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 ;).
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Objetos embebidos

Mensaje por Chefito »

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í>

Código: Seleccionar todo

$FileName=@ScriptDir & "\libro1.xls"
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 ;).
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Objetos embebidos

Mensaje por joaquin »

Gracias Chefito, justo lo que planteaba... :smt038
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 :smt017
Saludos
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Objetos embebidos

Mensaje por Chefito »

De nada :smt002 .
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

 
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 :smt003 .

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 ;).
joaquin
Aprendiz de Mago
Mensajes: 48
Registrado: 04 Jun 2008, 22:31
Ubicación: Barcelona, España

Re: Objetos embebidos

Mensaje por joaquin »

Gracias por ampliar la info...Sí fue muy instructivo :smt002 .
Responder