4D v16.3

Arrays y objetos de formulario

Inicio

 
4D v16.3
Arrays y objetos de formulario

Arrays y objetos de formulario  


 

 

Los arrays son objetos del lenguaje, usted puede crear y utilizar arrays que nunca aparecerán en una pantalla. Sin embargo, los arrays también son objetos de la interfaz del usuario. Los siguientes tipos de Objetos de formulario están soportados por arrays:

  • Menú desplegable
  • Combo Box
  • Área de desplazamiento (obsoleto a partir de 4D v13)
  • Pestaña
  • List box

Puede predefinir estos objetos en el editor de formularios del entorno Diseño utilizando el botón de los valores por defecto de la ventana Lista de propiedades (excepto List box), también puede definirlos por programación utilizando los comandos de arrays. En ambos casos, el objeto de formulario está soportado por un array creado por usted o por 4D.

Cuando utiliza estos objetos, puede detectar que elemento del objeto ha sido seleccionado (o recibió un clic) sometiendo a una prueba al elemento seleccionado del array. Inversamente, puede seleccionar un elemento particular del objeto designando el elemento seleccionado para el array.

Cuando un array se utiliza para generar un objeto de formulario, tiene una naturaleza doble; es a la vez un objeto del lenguaje y un objeto de la interfaz del usuario. Por ejemplo, cuando diseña un formulario y crea un área de desplazamiento:

El nombre de la variable asociada, en este caso atNombres, es el nombre del array que usted utiliza para crear y administrar el área de desplazamiento.

Notas

  • El elemento seleccionado del array se almacena internamente en una variable de tipo entero. Como resultado, no es posible utilizar arrays que contengan más de 32.767 elementos (sin embargo, un gran número de elementos no es adecuado para la visualización como un objeto de formulario).
  • No puede mostrar arrays de dos dimensiones ni arrays de punteros.
  • La gestión de objetos de tipo List box (los cuales pueden contener varios arrays) implica numerosos aspectos específicos. Estas particularidades se tratan en la sección Gestión programada de los objetos de tipo List box.

El siguiente ejemplo muestra cómo llenar un array y mostrarlo en una lista desplegable. Un array arSalarios se crea utilizando el comando ARRAY REAL. Contiene todos los salarios de las personas de una empresa. Cuando el usuario selecciona un elemento en el menú desplegable, el campo [Empleados]Salario recibe el valor escogido.

Cree un menú desplegable y llámela arSalarios. El nombre del menú desplegable debe ser el mismo del Array.

Inicialice el Array arSalarios utilizando el evento On Load para el objeto. Para hacer esto, recuerde activar el evento en la ventana Lista de propiedades, como se muestra a continuación:


Haga clic en el botón Método de objeto y cree el siguiente método:

Las líneas:

 ARRAY REAL(arSalarios;10)
 For($vlElem;1;10)
    arSalarios{$vlElem}:=2000+($vlElem*500)
 End for

crean el array numérico 2500, 3000... 7000, correspondiente a los salarios anuales de $30 000 a $84 000, antes de impuestos.

Las líneas:

 arSalarios:=Find in array(arSalarios;[Empleados]Salario)
 If(arSalarios=-1)
    arSalarios:=0
 End if

manejan la creación de un nuevo registro o la modificación de un registro existente.

  • Si crea un nuevo registro, el campo [Empleados]Salario inicialmente es igual a cero. En este caso, Find in Array no encuentra el valor en el array y devuelve -1. La prueba If (arSalarios=-1) coloca en cero a arSalarios, indicando que no se ha seleccionado un elemento en la lista desplegable.
  • Si modifica un registro existente, Find in Array recupera el valor en el array y da al elemento seleccionado de la lista desplegable el valor actual del campo. Si el valor para un empleado no está en la lista, la prueba If (arSalarios=-1) deselecciona todos los elementos de la lista.

Nota: para mayor información sobre el elemento de array seleccionado, lea la próxima sección.

Para reportar el valor seleccionado del menú desplegable arSalarios, sólo necesita administrar el evento On Clicked del objeto. El número de elemento seleccionado es el valor del array arSalarios. Por lo tanto, la expresión arSalarios{arSalarios} devuelve el valor seleccionado en la lista desplegable.

Complete el método de objeto arSalarios de esta forma:

 Case of
    :(Form event=On Load)
       ARRAY REAL(arSalarios;10)
       For($vlElem;1;10)
          arSalarios{$vlElem}:=2000+($vlElem*500)
       End for
       arSalarios:=Find in array(arSalarios;[Empleados]Salario)
       If(arSalarios=-1)
          arSalarios:=0
       End if
    :(Form event=On Clicked)
       [Empleados]Salario:=arSalarios{arSalarios}
 End case

El menú desplegable se ve así:

La siguiente sección describe las operaciones comunes y básicas que usted realizará sobre arrays cuando los utiliza como objetos de formulario.

Puede obtener el tamaño actual de un array utilizando el comando Size of Array. Utilizando el ejemplo anterior, la siguiente línea de código mostrará 5:

 ALERT("El tamaño del array atNombres es: "+String(Size of array(atNombres)))

Puede reordenar los elementos del array utilizando el comando SORT ARRAY o de diferentes arrays utilizando el comando MULTI SORT ARRAY. Utilizando el ejemplo anterior, y siempre que el array se muestre como un área de desplazamiento:

a. Al principio, el área se verá como la lista a la izquierda.

b. Después de la ejecución de la siguiente línea de código:

 SORT ARRAY(atNombres;>)

el área se verá como la lista en el medio.

c. Después de la ejecución de la siguiente línea de código:

 SORT ARRAY(atNombres;<)

el área se verá como la lista a la derecha.

Puede añadir, insertar, o borrar elementos utilizando los comandos APPEND TO ARRAY, INSERT IN ARRAY y DELETE FROM ARRAY.

Utilizando el ejemplo anterior, y siempre que el array se muestre como un área de desplazamiento, usted puede manejar los clics en esta área de la siguiente forma:

  ` Método de objeto área de desplazamiento atNombres
 Case of
    :(Form event=On Load)
  ` Inicializar el array (como se mostró anteriormente)
       ARRAY TEXT(atNames;5)
  ` ...
    :(Form event=On Unload)
  ` No necesitamos más el array
       CLEAR VARIABLE(atNombres)
 
    :(Form event=On Clicked)
       If(atNombres#0)
          vtInfo:="Usted hace clic en: "+atNombres{atNombres}
       End if
    :(Form event=On Double Clicked)
       If(atNombres#0)
          ALERT("Usted hace doble clic en: "+atNombres{atNombres}
       End if
 End case

Nota: los eventos deben ser activados en las propiedades del objeto.

Mientras la sintaxis atNombres{$vlElem} le permite trabajar con un elemento particular del array, la sintaxis atNombres devuelve el número del elemento seleccionado en el array. De esta manera, la sintaxis atNombres{atNombres} significa “el valor del elemento seleccionado en el array atNombres.” Si ningún elemento ha sido seleccionado, atNombres es igual a 0 (cero), de manera que la prueba If (atNames#0) detecta si un elemento ha sido seleccionado realmente o no.

Puede cambiar por programación el elemento seleccionado asignando un valor al array.

  ` Seleccionar el primer elemento (si el array no está vacío)
 atNombres:=1
 
  ` Seleccionar el último elemento (si el array no está vacío)
 atNombres:=Size of array(atNombres)
 
  ` Deseleccionar el elemento seleccionado (si lo hay) entonces ningún elemento está seleccionado
 atNombres:=0
 
 If((0<atNombres)&(atNombres<Size of array(atNombres))
  ` Si es posible, seleccionar el elemento siguiente al elemento seleccionado
    atNombres:=atNombres+1
 End if
 
 If(1<atNombres)
  ` Si es posible, seleccionar el elemento anterior al elemento seleccionado
    atNombres:=atNombres-1
 End if

El comando Find in Array busca un valor particular en un array. Utilizando el ejemplo anterior, el siguiente código seleccionará el elemento cuyo valor es “Ricardo,” si ese es el nombre introducido en la caja de diálogo de solicitud:

 $vsNombre:=Request("Introduzca el nombre:")
 If(OK=1)
    $vlElem:=Find in array(atNombres;$vsNombre)
    If($vlElem>0)
       atNombres:=$vlElem
    Else
       ALERT("No está "+$vsNombre+" en esta lista de nombres.")
    End if
 End if

Los menús desplegables, áreas de desplazamiento y pestañas generalmente pueden ser administrados de la misma manera. Evidentemente, no es necesario código adicional para redibujar objetos en la pantalla cada vez que cambie el valor de un elemento, o añada o borre elementos.

Nota: para crear y utilizar pestañas con iconos y activar y desactivar pestañas, debe utilizar una lista jerárquica como objeto de soporte para la pestaña. Para mayor información, vea el ejemplo del comando New list.

Mientras usted puede manejar menús desplegables, áreas de desplazamiento, y pestañas con los algoritmos descritos en la sección anterior, los combo boxes se manejan de forma diferente.

Un combo box es en realidad un área de entrada de texto la cual está asociada a una lista de valores (los elementos del array). El usuario puede elegir un valor de esta lista, y luego editar el texto. Por lo tanto, para un combo box, la noción de elemento seleccionado no aplica.

Con los combo boxes, nunca hay un elemento seleccionado. Cada vez que el usuario selecciona uno de los valores asociado al área, el valor se coloca en el elemento cero del array. Luego, si el usuario edita el texto, el valor modificado por el usuario también se coloca en el elemento cero.

Ejemplo  

  ` Método de objeto Combo Box asColores
 Case of
    :(Form event=On Load)
       ARRAY STRING(31;asColores;3)
       asColores{1}:="Azul"
       asColores{2}:="Blanco"
       asColores{3}:="Rojo"
    :(Form event=On Clicked)
       If(asColores{0}#"")
  ` El objeto cambia automáticamente su valor
  ` La utilización dle evento On Clicked con un Combo Box
  ` se necesita sólo cuando se deben tomar acciones adicionales
       End if
    :(Form event=On Data Change)
  ` Buscar en array ignora el elemento 0, de manera que devuelve -1 o >0
       If(Find in array(asColores;asColores{0})<0)
  ` El valor introducido no es uno de los valores adjuntos al objeto
  ` Añadir el valor a la lista para la próxima vez
          APPEND TO ARRAY(asColores;asColores{0})
       Else
  ` El valor introducido está entre los valores adjuntos al objeto
       End if
 End case



Ver también 

Arrays

 
PROPIEDADES 

Producto: 4D
Tema: Arrays

 
HISTORIA 

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)