Compartir a través de


Manipular objetos mediante Automatización

Los objetos OLE de los formularios o programas, o los controles ActiveX dentro de los controles OLE Container, pueden manipularse con código de la misma manera en que se programan los objetos de Visual FoxPro nativos.

Manipular propiedades extrínsecas de objetos

En el código, puede manipular un objeto mediante sus propiedades. La manera en que se hace referencia a una propiedad depende de si el objeto es autónomo o forma parte de un contenedor, como el control OLE Container u OLE Bound.

Nota   Los controles ActiveX siempre forman parte de un control OLE Container.

Un objeto de un contenedor consta de dos partes: el propio objeto y el contenedor alrededor del mismo. Tanto el objeto como el contenedor tienen propiedades y, a veces, tienen los mismos nombres de propiedades. Para asegurarse de que hace referencia a las propiedades del objeto, anexe siempre la propiedad Object del contenedor al nombre del objeto. Por ejemplo, el código siguiente hace referencia a la propiedad Left del objeto:

frm1.olecontrol1.Object.Left = 25  && Object's Left

Si se omite la propiedad Object, se hace referencia a la propiedad Left del contenedor:

frm1.olecontrol1.Left= 25  && Container's Left property 

Por ejemplo, suponga que tiene una aplicación que envía correo cuando el usuario hace clic en un botón de comando de redacción. Si ha agregado un control Microsoft MAPI Messages a un formulario como olecontrol1, el código asociado al evento Click del botón de comando podría ser:

THISFORM.olecontrol1.Object.Compose
THISFORM.olecontrol1.Object.Send(.T.)

Además de usar la propiedad Object para hacer referencia a las propiedades del objeto contenido, puede emplear otras propiedades del control contenedor. Por ejemplo, puede hacer referencia a la propiedad OLEClass de sólo lectura para identificar el tipo de objeto del contenedor y la propiedad Sizable para impedir que los usuarios puedan cambiar el tamaño de un objeto. Para obtener detalles acerca de las propiedades del control contenedor, consulte Control OLE Container.

En los diseñadores de formularios y clases, las propiedades de los controles ActiveX se muestran en la ventana Propiedades de Visual FoxPro, pero la mayoría de los controles ActiveX también tienen su propia interfaz para establecer propiedades comunes. Puede ver esta interfaz de las propiedades si selecciona la opción Propiedades específica del objeto en el menú contextual del control ActiveX. Por ejemplo, para abrir el cuadro de diálogo Propiedades correspondiente a un control RichText, elija Propiedades del control Microsoft RichText en el menú contextual.

Usar métodos extrínsecos de objetos

Además de establecer y recuperar las propiedades de los objetos, puede manipular un objeto usando los métodos que admite. Por ejemplo, puede usar el método Add de un objeto de colección de Microsoft Excel para crear un libro de Excel.

El siguiente ejemplo de Automatización utiliza el método Add para crear un libro de Excel, el método Save para guardar el libro y el método Quit para salir de Excel:

Código Comentarios
oleApp = CREATEOBJECT("Excel.Application")
Inicia Excel.
OleApp.Visible=.T.
Muestra Excel.
OleApp.Workbooks.Add
Crea un libro.
OleApp.Cells(1,1).Value=7
Establece el valor de la celda.
OleApp.ActiveWorkbook.SaveAs("C:\TEMP.XLS")
Guarda el libro.
OleApp.Quit
Sale de Excel.

Si crea un objeto con el control OLE Container o el control OLE Bound, puede usar el método DoVerb del control para ejecutar un verbo en el objeto. Por ejemplo, use DoVerb(0) para ejecutar el verbo predeterminado, DoVerb( – 1) para activar el objeto para edición visual, y DoVerb( – 2) para abrir el objeto en una ventana distinta.

Nota   Consulte la documentación de la aplicación para determinar qué comandos de Automatización se admiten. Por ejemplo, los complementos de Microsoft Excel no están disponibles para Automatización.

Establecer tiempos de espera

Cuando se transfiere una solicitud a un objeto OLE, el servidor de Automatización la procesa. No tendrá mucho control sobre el proceso del servidor, pero podrá especificar el tiempo que puede esperar para que finalice el proceso si establece las propiedades OLERequestPendingTimeout y OLEServerBusyTimeout. También podrá determinar lo que ocurrirá cuando haya transcurrido ese tiempo si establece la propiedad OLEServerBusyRaiseError.

Acceso a colecciones de objetos

Un tipo de objeto puede representar un único objeto o una colección de objetos relacionados. Por ejemplo, un objeto Workbook de Excel representa un único libro, mientras que el objeto Workbooks representa todos los libros actualmente cargados. Puesto que el objeto Workbooks representa una colección de objetos, se llama objeto de colección.

En código, una colección es una lista no ordenada en la que la posición de un objeto puede cambiar siempre que se agreguen o quiten objetos de la colección. Para tener acceso a un objeto de una colección debe iterar dentro de la colección mediante la propiedad Count de la misma. La propiedad Count devuelve el número de elementos de la colección. Además, puede usar el método Item para devolver un elemento de la colección.

Por ejemplo, para mostrar los nombres de las hojas de cálculo en un libro de Excel, use el siguiente código:

oleApp = CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
FOR EACH x IN oleApp.Workbooks
 ? x.Name
ENDFOR

También puede tener acceso a una colección dentro de otra colección. Por ejemplo, puede tener acceso a una colección de celdas dentro de un intervalo con el código siguiente:

oleApp = CREATEOBJECT("Excel.sheet")
oleApp.Workbooks.Add
oleApp.Range(oleApp.Cells(1,1),oleApp.Cells(10,10)).Value=100
oleApp.Visible=.T.

Usar matrices de objetos

Puede transferir matrices a métodos y recibir matrices de vuelta. Sin embargo, debe transferir las matrices por referencia prefijando el nombre de la matriz con el signo @.

Por ejemplo, para transferir una matriz de Visual FoxPro a Microsoft Excel, considere el siguiente código. Crea una matriz en Visual FoxPro, asigna a la matriz algunos valores, inicia Microsoft Excel, crea un libro, establece un valor como la primera celda de una hoja de cálculo y entonces copia el valor a las otras hojas de la matriz:

DIMENSION aV(3)
aV(1) = "Sheet1"
aV(2) = "Sheet2"
aV(3) = "Sheet3"
oleApp=CREATEOBJECT("Excel.Application")
oleApp.Workbooks.Add
oleI=oleApp.Workbooks.Item(1)
oleI.Sheets.Item(1).Cells(1,1).Value = 83
oleI.Sheets(@aV).;
 FillAcrossSheets(oleI.Worksheets("Sheet1").Cells(1,1))

oleApp.Visible = .T.

Además, el siguiente ejemplo devuelve una matriz a Visual FoxPro y muestra el contenido de la matriz:

oleApp = CREATEOBJECT("Excel.Application")
aOleArray = oleApp.GetCustomListContents(3)
FOR nIndex = 1 to ALEN(aOleArray)
   ? aOleArray(nIndex)
ENDFOR

Nota   Con Visual FoxPro no puede transferir matrices de más de dos dimensiones a objetos OLE. Para obtener más información acerca de cómo trabajar con matrices en Visual FoxPro, consulte Programación orientada a objetos e Introducción al lenguaje.

Liberar objetos extrínsecos

Un servidor de Automatización se libera automáticamente si no está visible y si no hay variables en el ámbito que hagan referencia al objeto. Puede usar el comando RELEASE para liberar la variable asociada a un objeto. Si el servidor está visible, use el método Quit para liberarlo.

Vea también

Usar controles ActiveX | Crear subclases de objetos | Agregar OLE | OLE Container | OLE Bound | Object