Los objetos externos pueden ser manejados mediante la creación de un tipo especial de componente referenciado como “no visual”. Todos ellos se encuentran ubicados dentro de la carpeta Xcomp que (a su vez) podemos encontrar dentro del directorio raíz de instalación de Omnis Studio. Pero no todos los Xcomp pueden ser utilizados de éste modo. De hecho, la mayoría de los Xcomp sólo contienen objetos “visuales”, los cuales podemos colocar en ventanas, formularios e informes, pero, incluso algunos de éstos también contienen algún componente “no visual” que podemos utilizar como clase base, en la construcción de la variable objeto (variable de tipo “”Object”) o bien como superclase de una clase de tipo objeto (clase de tipo “Object”).
Existen relativamente pocos de estos Xcomps especiales. Una manera de descubrirlos es navegar a través de la lista de componentes externos disponibles, mediante abrir el enlace correspondiente desde el Explorador de Omnis Studio. Tal y como se muestra el siguiente imagen:
Existen relativamente pocos de estos Xcomps especiales. Una manera de descubrirlos es navegar a través de la lista de componentes externos disponibles, mediante abrir el enlace correspondiente desde el Explorador de Omnis Studio. Tal y como se muestra el siguiente imagen:
Explorando los componentes externos
Cómo podrá comprobar existe un gran número de componentes externos. Pero sólo el hecho de su aparición, no significa que esté siendo usado por Omnis Studio, ya que primero deberán ser cargados en memoria. La forma más sencilla de hacerlo es mediante indicar su estado de precarga, tal como se puede observar a continuación:
En éste artículo nos centraremos en los componentes recogidos bajo el grupo “External Components”. Si lo ampliamos podremos ver algo similar a los siguiente:
Podríamos mantener componentes alojados en cualquier parte de nuestro sistema, pero lo mejor es agruparlos en la carpeta Xcomp.
Los componentes actualmente cargados se muestran en la lista con un punto verde y los que no, con un punto rojo. Podemos configurar cualquiera de ellos para que sea cargado al iniciarse Omnis o bien al abrirse la librería en uso, mediante hacer clic en el botón de la opción correspondiente. Tenga en cuenta que el color del punto no cambiará inmediatamente, ya que los cambios no se verán reflejados hasta la próxima vez que abramos ésta ventana de configuración. Pero si podremos hacer uso de los cambios introducidos sin necesidad de reiniciar Omnis Studio, no cerrar y volver a abrir nuestra librería.
Los elementos se muestran bajo la denominación “libraries”, y es una denominación apropiada, pues a medida que vamos recorriendo los diferentes elementos de la lista, enseguida nos damos cuenta de que muchos de ellos contienen a su vez varios componentes. Mostrados a la derecha, podemos ver los nombres de dichos componentes, junto con iconos representativos del tipo al que pertenecen. Éstos pueden ser: Ventana, Informe y Objeto. Los componentes “Remote Form”” están localizados en la lista bajo un grupo diferente denominado “Form External Components”, pero en este artículo, deseamos centrarnos en el uso de los componentes de tipo Objeto (Object), son los mostrados mediante un icono en forma de caja y con un enchufe saliendo de ella.
En el dibujo anterior, podemos ver los controles que integran el componente “Graph2”. Observe la existencia de tres controles, uno de tipo ventana, otro de tipo informe y otro de tipo objeto.
Una vez que el componente externo ha sido cargado por Omnis, podrá ser usado con diversos fines dentro de nuestra librería. Un modo de hacerlo, es mediante localizar cualquier componente con interfaz gráfica de usuario, desde el “Component Store” y arrastrarlo sobre la posición que deseemos durante el diseño de una clase apropiada para su uso. Pero cuando se trata de componentes de tipo objeto “no visuales” su modo de uso es diferente.
Uso de un objeto externo (External Object)
Existen dos formas básicas de uso. 1) Seleccionar el componente de tipo objeto, como subtipo en una variable de tipo objeto o especificarlo más adelante mediante el método “$new()”. 2) Disponer el componente de tipo objeto, bajo el atributo superclase (superclass) en una “Object Class”. Pueden existir diferentes razones por las que preferir una u otra técnica.
Por el momento, vamos a utilizar la segunda técnica, ya que nos da la oportunidad de explorar fácilmente las propiedades y métodos del objeto. De modo que vamos a crear una nueva “Object Class” con el nombre “timerObject”, después y mediante el “Property Manager”, vamos a asignarle el xcomp “Timer” como superclase de nuestra recién creada “Object Class”. Tras hacer clic sobre el valor para ésta propiedad, aparecerá el diálogo que nos permite realizar su elección de entre la lista de componentes. Observe que sólo se muestran los xcomps de tipo objeto:
Ahora podemos abrir la clase “timerObject” y ver su contenido. Observe que la “Object Class” ha heredado los métodos y propiedades del componente externo. Tras abrir la clase, podemos visualizar dichos métodos en el editor:
Los elementos heredados aparecen (por defecto) en azul. (ver $root.$prefs):
La “Inheritance” (herencia) es una característica de la programación orientación a objetos soportada por Omnis Studio. Cada vez que se cree una instancia de nuestro objeto, recibirá los métodos y propiedades de la superclase.
Puede darse el caso de que queramos sustituir un método heredado, por otro nuestro, pero manteniendo su actual nombre, con el único fin de sustituir su código o acción por defecto. Puede que incluso tangamos imperiosas razones para hacerlo así en éste caso, ya que el método denominado “$timer” es el método invocado cuando el cronómetro (en su cuenta atrás) llega a cero. Tras su herencia, está vacío, por lo que debemos hacer un “overriding”, a fin de anular su acción por defecto. A continuación mostramos como hacerlo:
En éste caso el método se hereda vacío, pero también puede suceder que deseemos reemplazar un método que realmente hace algo. Por ejemplo, tal vez necesitemos añadir un par de pasos adicionales al método “$resettimer” a fin de reiniciar otras variables. Tenga en cuenta que aunque hayamos anulado y sustituido el método por el nuestro propio, podemos seguir invocándolo para su ejecución desde cualquier punto del método mediante el comando “Do inherited”, tal y como mostramos a continuación:
El editor de métodos nos permite ver los nombres de los métodos heredados, pero el “Interface Manager” nos permite ver un poco más. Accedemos a la “Interface Manager” desde el menú “View” del editor de métodos. En la siguiente imagen, puede observar como es posible ver los métodos y las propiedades, así como información adicional de ayuda:
Desde aquí, podemos examinar los parámetros disponibles para el método seleccionado y leer su descripción. En el caso de métodos no heredados o anulados, podemos optar por incluir nuestras propias descripciones. La pestaña de propiedades nos permite leer la descripción de la propiedad seleccionada. A continuación veremos un segundo modo de hacer uso de un objeto externo.
Consiste en simplemente heredar (inherit) la funcionalidad del Xcomp directamente sobre una variable de tipo objeto. La forma más sencilla de hacerlo es mediante indicar la xcomp a utilizar, reflejándola como subtipo de la variable de objeto, desde el panel de definición de variables.
Una variable “Object” definida de esta forma, hereda todos los métodos y propiedades que vimos anteriormente para la “Object Class”.
Si deseamos examinar sus métodos y propiedades con mayor detalle, puede optar por abrir el “Interface Manager” desde el menú contextual de la propia variable:
Si lo preferimos, podemos hacer uso del método “$new()” para crear una instancia de la variable objeto, indicando al mismo tiempo el xcomp a utilizar. Dado que la mayoría de éstos xcomps no contienen un método “$construct”, no hay mucha razón para hacerlo, pero ciertamente está permitido. El modo sería la siguiente:
Tenga en cuenta que debemos indicar el nombre de la librería de componentes, seguido de “$objects”, con el fin de poder localizar el nombre del elemento de entre los tres, que la componen.
Por último, indicar también que podríamos hacer uso de una variable de tipo “Object reference” en lugar de una variable “Object”. Recuerde que esta variable (o puntero) deben ser usadas mediante el método “$newref()” en lugar de “$new()”, tal y como mostramos a continuación:
La única desventaja de esto, es que no se nos permite utilizar el “Interface Manager” para ver los métodos y propiedades del objeto mientras trabajamos.
Gracias por su atención.