4D v16.3

Interacción entre componentes y bases locales

Inicio

 
4D v16.3
Interacción entre componentes y bases locales

Interacción entre componentes y bases locales  


 

Cuando un componente se instala en una base local, su nombre aparece en la Página Métodos del Explorador de la base local, en el tema Métodos componente. Los métodos proyecto compartidos se listan como listas jerárquicas y si el componente es interpretado, su contenido se muestra en el área de previsualización.

Para mayor información sobre la definición de los métodos compartidos, consulte Compartir métodos proyecto.

Ciertos tipos de objetos definidos por un componente se desarrollan en un espacio de ejecución propio, el cual elimina las posibilidades de conflictos con los objetos existentes de la base local y con otros componentes. Estos objetos se llaman “no compartidos” o “particionados.” Por ejemplo, las variables están particionadas, lo cual significa que una variable <>Mivar de tipo Entero largo creada y manipulada por un componente puede coexistir con una variable <>Mivar variable de tipo Texto creada y utilizada por la base local (o por otro componente).

Otros objetos comparten el mismo espacio de ejecución entre la base local y los componentes. El empleo de estos objetos requiere tomar más precauciones pero permite a la base local y a los componentes comunicarse mutuamente. Estos objetos se llaman “compartidos” o “no-particionados”. 

Por ejemplo, los conjuntos son no particionados, lo cual significa que si un componente crea el conjunto miConjunto, se borrará si la base local ejecuta la instrucción:

 CLEAR SET(mySet)

Los objetos no compartidos (particionados) entre los componentes y las bases locales son los siguientes:

  • hojas de estilo
  • mensajes de ayuda
  • listas de selección
  • imágenes de la librería
  • menús y barras de menús creadas vía el editor de menús
  • métodos de proyecto sin la propiedad “Compartido por componentes y base local”
  • semáforos
  • procesos
  • variables (locales, procesos e interproceso)
  • variables sistema (OK, Document, etc.)
  • formularios tabla
  • formularios proyecto sin la propiedad "Publicar como subformulario"
  • recursos y referencias a los archivos de recursos abiertos

Los objetos compartidos (no particionados) entre los componentes y las bases locales son los siguientes:

  • conjuntos
  • selecciones temporales
  • listas jerárquicas utilizando una referencia (creadas vía los comandos New list, Load list, Copy list o BLOB to list)
  • menús y barras de menús utilizando la referencia devuelta por el comando Create menu.
  • métodos de proyecto con la propiedad “Compartido por componentes y base local”
  • Referencias Window (WinRef)
  • formularios proyecto con la propiedad "Publicada como subformulario en la base local"
  • referencias de estructura XML
  • referencias de archivos abiertos (excepto para los archivos de recursos)
  • punteros

Nota: por supuesto, los objetos no utilizables presentes en una base matriz son ignorados por la base local (ver Objetos utilizables y no utilizables).

Todos los métodos proyecto de una base matriz se incluyen por definición en el componente (la base es el componente), lo cual significa que pueden ser llamados y ejecutados por el componente.

Por otra parte, por defecto estos métodos de proyecto no serán visibles, ni pueden ser llamados por la base local. En la base matriz debe designar explícitamente los métodos que quiere compartir con la base local. Estos métodos de proyecto serán visibles en la Página Métodos del Explorador y pueden llamarse en el código de la base local (pero no pueden ser modificados en el editor de métodos de la base local). Estos métodos constituyen los puntos de entrada en el componente. 

Por el contrario, por razones de seguridad, por defecto un componente no puede ejecutar métodos proyecto que pertenezcan a la base local. En algunos casos, podría necesitar autorizar a un componente a acceder a los métodos de proyecto de su base local. Para hacerlo, debe designar explícitamente los métodos proyecto de la base local que quiere que sean accesibles a los componentes.

Esta configuración se efectúa vía la propiedad Compartido por componentes y base principal en la caja de diálogo de propiedades de los métodos:

También es posible aplicar esta propiedad a los diferentes métodos a la vez vía la caja de diálogo de atributos globales (accesible desde el menú contextual del Explorador) (ver Cambio global de atributos de métodos).

El efecto de esta opción está definido por el contexto de utilización de la base: si la base se utiliza como un componente, el método será accesible en la base local y visible en el Explorador. Si la base es una base local, el método será utilizable por los componentes.

Puede compartir los formularios de la base matriz y utilizarlos como subformularios en la base local.

Del lado del componente (base matriz), sólo los subformularios proyecto pueden especificarse como subformularios publicados.

Para que un formulario de componente pueda ser seleccionado como un subformulario en una base local, debe haber sido expresamente designado como "formulario publicado" en la caja de diálogo de las propiedades del formulario vía la opción Publicado como subformulario en la base local:



Nota: esta caja de diálogo es accesible vía el comando Propiedades del formulario del menú contextual o del menú de acción del Explorador (ver Propiedades del formulario (Explorador)).

Debe administrar las interacciones entre el subformulario y los formularios padres de la base local utilizando los mecanismos y herramientas descritas en  Subformularios en página.

Del lado de la base principal, es imperativo que los subformularios provenientes de componentes se utilicen en modo página: en el editor de formularios, cuando el objeto subformulario se selecciona en el formulario padre, deselecciona la opción Subformulario listado en el tema "Subformulario" de la Lista de Propiedades. 

Luego elija, <Ninguno> en el menú "Tabla". Los formularios publicados por los componentes se listan en el menú "Formulario detallado". Su nombre es seguido por el del componente entre paréntesis. Puede seleccionar de esta lista el formulario a utilizar en la lista "Formulario detallado".

Una nueva instancia del objeto seleccionado se crea inmediatamente en el formulario.

Los componentes y las bases locales no comparten las variables locales proceso o interproceso. La única forma de acceder a las variables del componente desde la base local y viceversa es utilizando punteros.

Ejemplo utilizando un array:

  • En la base local:
     ARRAY INTEGER(MiArray;10)
     AMethod(->MiArray)
  • En el componente, el método de proyecto AMethod contiene:
     APPEND TO ARRAY($1->;2)

Ejemplos utilizando variables:

 C_TEXT(mivariable)
 component_method1(->mivariable)
 C_POINTER($p)
 $p:=component_method2(...)

El uso de punteros para permitir la comunicación de los componentes y la base local requiere que se tengan en cuenta las siguientes especificaciones:

  • El comando Get pointer no devolverá un puntero a una variable de la base local si se llama desde un componente y viceversa.
  • La arquitectura de los componentes autoriza la coexistencia, dentro de la misma base interpretada, de componentes interpretados y compilados (por el contrario, sólo los componentes compilados pueden utilizarse en una base compilada). El uso de punteros en este caso debe respetar el siguiente principio: el intérprete puede desapuntar un puntero construido en modo compilado, pero no es posible desapuntar un puntero construido en modo interpretado.
    Vamos a ilustrar este principio con el siguiente ejemplo: dados dos componentes, C (compilado) e I (interpretado), instalados en la misma base local.
    • si el componente C define la variable miCvar, el componente I puede acceder al valor de esta variable utilizando el puntero ->miCvar.
    • si el componente I define la variable miIvar, el componente C no puede acceder a esta variable utilizando el puntero ->mivarI. Esta sintaxis produce un error de ejecución.
  • La comparación de punteros vía el comando RESOLVE POINTER no es recomendable con componentes ya que el principio de particionamiento de variables autoriza la coexistencia de variables del mismo nombre pero con contenido radicalmente diferente en un componente y la base local (u otro componente). El tipo de variable puede incluso ser diferente en ambos contextos.
    Si los punteros miptr1 y miptr2 apuntan cada uno a una variable, siguiente la comparación producirá un resultado incorrecto:
     RESOLVE POINTER(miptr1;vNomVar1;vnumtabla1;vnumcamp1)
     RESOLVE POINTER(miptr2;vNomVar2;vnumtabla2;vnumcamp2)
     If(vNomVar1=vNomVar2)
      //Esta prueba devuelve True aunque las variables sean diferentes

    En este caso, es necesario utilizar la comparación de punteros:
     If(miptr1=miptr2) //Esta prueba devuelve False

Aunque los componentes no pueden utilizar tablas, los siguientes comandos pueden llamarse dentro de un componente:

DEFAULT TABLE
NO DEFAULT TABLE
Current default table

En efecto, estos comandos son útiles cuando un componente debe utilizar tablas de la base local. En este caso los punteros permitirán a la base local y al componente comunicarse entre sí. Por ejemplo, este es un método que puede ser llamado desde un componente:

 C_LONGINT($1//Número de tabla en la base local
 $punterotabla:=Table($1)
 DEFAULT TABLE($punterotabla->)
 CREATE RECORD //Usa la tabla por defecto de la base local
 $punterocampo:=Field($1;1)
 $punterocampo->:="value"
 SAVE RECORD

Excepto por Comandos no utilizables, un componente puede utilizar todo comando del lenguaje 4D.

Cuando se llaman los comandos desde un componente, se ejecutan en el contexto del componente, excepto por el comando EXECUTE METHOD que utiliza el contexto del método especificado por el
comando. Note también que los comandos de lectura del tema “Grupos y usuarios” pueden ser utilizados desde un componente pero leerán los usuarios y grupos de la base local (un componente no tiene
sus propios usuarios y grupos).

Los comandos SET DATABASE PARAMETER y Get database parameter son la excepción a este principios: su alcance es global a la base. Cuando estos comandos son llamados desde un componente, se aplican a la base local.

Además, se han definido medidas específicas para los comandos Structure file y Get 4D folder cuando se utilizan en el marco de componentes (ver el manual de Lenguaje).

El comando COMPONENT LIST permite conocer la lista de los componentes cargados por la base local.

Cuando utiliza componentes no compilados, su código aparece en el depurador estándar de la base local.

El depurador respeta los espacios de ejecución de los objetos particionados. Si muestra el valor de la variable var1 de la base local en la ventana de evaluación luego ejecute el código que pertenece al componente que contiene igualmente una variable var1, el valor mostrado no se actualizará. Debe mostrar otra instancia de la variable en la ventana de evaluación para obtener su valor en el contexto actual.

 
PROPIEDADES 

Producto: 4D
Tema: Desarrollar e instalar componentes 4D

 
HISTORIA 

 
ARTICLE USAGE

Manual de Diseño ( 4D v16)
Manual de Diseño ( 4D v16.1)
Manual de Diseño ( 4D v16.3)