lunes, 20 de mayo de 2024

INTERFACES. OOo Basic.

Formularios Calc

Formularios y cuadros de diálogo

También es posible utilizar formularios en Calc sin necesidad de acceder a la capa gráfica getDrawPage(). Esto es posible por permitir LibreOffice la vinculación de los principales controles de formulario con las celdas.

Cuando implementamos un control en una hoja de cálculo podemos definir sus características desde

Propiedades del control

(1). Este menú consta de 2 ó 3 submenús. En el segundo de ellos (Datos) podemos incluir, si es que está disponible, la referencia a la celda (vg. A7) con la que vinculamos el control desde la opción Celda enlazada. Esta opción está disponible para los cuatro control que vimos en la entrada anterior, estos es, para los controles Cuadro de texto, Cuadro de lista, Botón de opción y Casilla.

Al establecerse esta asociación (2) podemos acceder al contenido creado por el usuario accediendo directamente a la celda vinculada, evitando así el acceso a la capa gráfica del documento.

Como sabemos (3), para acceder al contenido de una celda deberemos seguir lo pasos siguientes:



Dim oDocumento As Object, oHojaActiva As Object, oCelda As Object

Dim sContenido As String

oDocumento = ThisComponent 

oHojaActiva = oDocumento.getCurrentController.getActiveShee()

oCelda = oHojaActiva.getCellRangeByName("E3")

sContenido = oCelda.getString()


La repetición de las líneas 5-6 de este script (con la creación de tantas variables Object y String como controles-celdas tenga nuestro formulario), nos permitirá acceder al conjunto de datos introducidos por el usuario. Aunque el procedimiento básico es así de simple, deberemos considerar las peculiaridades y/o posibilidades que presentan los distintos tipos de control, ya que lo anterior es válido para el control Cuadro de texto, y también para el resto, pero cada uno de los restantes presenta alguna peculiaridad que es necesario conocer.

El control Cuadro de lista en su configuración permite seleccionar, además de la celda enlazada, el contenido que mostrará dicha celda. Esta opción está disponible desde Datos | Contenido de la celda enlazada, pudiendo establecer bien la Entrada seleccionada o bien la Posición de la entrada seleccionada (4). Aunque en este ejemplo y en la mayoría de los formularios con los que trabajemos, la opción preferente será la primera (La entrada seleccionada), tanto por su funcionalidad como por su facilidad de uso en el script (5), habrá ocasiones en las que sea conveniente trabajar con Posición de la entrada seleccionada, precisamente por tratarse de un valor numérico (6).

En este caso la variable que asociemos al contenido de la celda y el tratamiento posterior de esta variable (y su contenido) serán muy diferente al que normalmente haremos con el texto resultante de la opción Entrada seleccionada (ver nota 4).

El, o mejor aun, los controles Botón de opción y Casilla presentan también peculiaridades que es necesario conocer, aunque en estos casos se trata tanto de la vinculación a las celdas como del tratamiento del resultado de la elección y su constatación en el contenido de las celdas.

Es necesario saber, en primer lugar, que cada botón o cada casilla se debe asociar a una celda diferente. Esto tiene sentido para las casillas, pero puede parecer extraño para los botones, ya que éstos están vinculados y la elección de uno implica necesariamente la no elección del resto (7). No obstante, la lógica de la asociación control-celda impone que se vincule cada botón a una celda, ya que si vinculamos todos los botones a la misma celda lo que hacemos (por la bidireccionalidad explicada en nota 2) es precisamente equivalente a seleccionar todos los botones.

Lo segundo que debemos saber es que, en coherencia con la naturaleza de los botones y las casillas, lo que ambas devuelven (y queda escrito en las celdas enlazadas) en un valor booleano ("VERADERO" | "FALSO"), lo que conlleva repercusiones tanto para el acceso al contenido de dichas celdas como para el posterior tratamiento de estos datos. Se abren además diferentes opciones de trabajo para el desarrollo de este tratamiento. Veamos las implicaciones de lo anterior en nuestro formulario de ejemplo.

En él contamos con dos botones para la elección del sexo del alumno (por ejemplo), cada uno de ellos asociado a una celda (por las razones antes dichas), concretamente btnM está vinculado a F15 y btnF a F16. En ambos casos, en dichas celdas se escribe de forma simultánea VERDADERO y FALSO (o viceversa) según pulsemos en el primer o en el segundo botón (8).

Ahora bien, a nosotros lo que nos interesa es lo que deriva de la elección del usuario, esto es: conocer si el sujeto referenciado es niño o niña (9) y nada de eso nos dice el contenido de F15 o de F16 (10).

Para convertir VERDADERO | FALSO en niño | niña necesitamos emplear una estructura o función condicional, pudiendo optar por emplear las funciones integradas de Calc o por el tratamiento condicional de OOo Basic (If...Else...End if. En el primer caso (que es lo que hacemos en nuestro ejemplo) construimos sobre la celda G15 la siguiente función:

  • =SI(F15=1,"niño";"niña) (11).

En el segundo accederemos mediante código al contenido de la celda F15 y construiremos una estructura condicional como se ejemplifica a continuación, y que cumple la misma función (12):



Dim oCeldaSexo As Objet
Dim sSexo As String

oCeldaSexo = oHojaActiva.getCellRangeByName("F15")

If oCeldaSexo.getValue = 1 Then 'Ver nota 11
	sSexo = "niño"
Else
	sSexo = "niña"
End If


También en Casilla sucede algo similar. En nuestro ejemplo se utilizan tres casillas, cada una de ellas asociada a una celda (F19, F20 y F21 respectivamente) que contienen valores booleanos VERADERO | FALSO.

También en este caso disponemos de dos opciones para convertir estos valores en el resultado que nos interesa (en este caso la puntuación del ítem).

La opción basada en las funciones Calcse desarrolla en dos fases:

  • En la primera puntuamos cada ítem mediante una función condicional =SI(F19="";"";SI(F19=0;1;0)) sobre las celdas G19, G20 y G21
  • Y en la segunda calculamos el total de puntuación del ítem mediante la función Calc =SUMA(G19:G21)

Dadas las características de Casilla tenemos que tomar en cuenta la acción del usuario sobre cada una de las que componen este elemento del formulario, siendo esta una diferencia con el tratamiento del control Botón. Por ese mismo motivo necesitamos realizar la segunda fase (el sumatorio), ya que el análisis de la casilla individual no nos permite acceder al resultado del conjunto. Esto también es válido para la opción basada en OOo Basic, como veremos a continuación.



Dim oCeldaItem1 As Object,oCeldaItem2 As Object,oCeldaItem3 As Object
Dim iPuntos As Integer

iPuntos = 0

If oCeldaItem1.getValue = 0 Then
    iPuntos = iPuntos + 1
End If

If oCeldaItem2.getValue = 1 Then
    iPuntos = iPuntos + 1
End If

If oCeldaItem3.getValue = 1 Then
    iPuntos = iPuntos + 1
End If


Puedes observar como, en esta modalidad necesitamos tres variables Object, una para cada Casilla oCeldaItem1, oCeldaItem2 y oCeldaItem3 además de una variable Integer para el sumatorio de la puntuación. Además, cada variable Ítem debe ser sometida al análisis condicional vg. If oCeldaItem1.getValue = 0 y el cálculo de la puntuación total (el sumatorio) se realiza asignando repetidamente la propia variable a si misma más el punto que corresponde por acierto iPuntos = iPuntos + 1 (13).

Documento. Formulario Calc (2ª opción)

NOTAS
1 Sobre la implementación manual de un formulario en un documento ver esta entrada
2 La asociación o vinculación entre el control y la celda es bidireccional; en consecuencia, lo que escribamos o seleccionemos en el control se escribe en la celda y viceversa. Lógicamente también lo que se modifique o se borre.
3 Ver procedimiento en esta entrada
4 En el primer caso mostrará en la celda asociada el texto seleccionado de la lista de opciones que tenga establecido Cuadro de lista (vg. 1º EP), y en el segundo, para esta misma elección del usuario, mostrará en la celda el valor numérico 2, ya que se trata del 2º elemento de la lista de opciones. La consecuencia es tanto para la visualización del resultado como para el procedimiento de acceso al contenido de la celda enlazada, ya que la variable receptora deberá ser (preferiblemente) de tipo numérico; pero también puede tener consecuencias para el posterior tratamiento del contenido de la variable con la que asociemos este dato.
5 Esta opción tiene la ventaja de permitir un tratamiento directo del contenido textual, pero también la total similitud del proceso con el que realizamos con Cuadro de texto.
6 Un ejemplo de esto es cuando la elección del usuario implique valor cardinal u ordinal, como en el caso de las escalas tipo Likert. Estas escalas pueden construirse utilizando diferentes controles. Cuadro de lista es uno de ellos.
7 Cosa que, como sabemos, no ocurre con las casillas, dado que es es posible seleccionar cada casilla de forma independiente. Por ello es lógico que cada casilla esté asociada a una celda distinta. Pero el valor final de una elección entre varias opciones excluyente de un botón (entre varios), sólo puede arrojar un único resultado.
8 Esta simultaneidad es resultado de la vinculación entre ambos botones. Es coherente con su lógica de funcionamiento y, en consecuencia, síntoma de una correcta configuración del conjunto.
9 Por ejemplo en el supuesto de que tal categorización tenga efectos en las formas gramaticales de un texto que describa el resultado de un análisis de datos o una comunicación personalizada con la familia, etc.
10 Obviamente, a excepción de lo que nos permite la visualización directa del formulario; pero estamos hablando aquí de la automatización del análisis de los resultados, no del que podemos realizar manualmente visualizando los datos que se nos muestran en la hoja de cálculo.
11 No es necesario trabajar con el contenido de la celda F16 dada la asociación que se establece entre los botones de opción. Ver explicación en el texto de la entrada, contenidos asociados a las notas 7y 8, y en las propias notas. Observa que VERADERO es sustituido por 1. Esto se debe a la equivalencia entre 1 -> VERADERO y 0 -> FALSO cuando se trata de booleanos. Lo mismo sucede en el código alternativo OOo Basic If oCeldaSexo.getValue = 1 Then
12 Queda a tu decisión optar por una u otra opción, pero es necesario que conozcas ambas para que estés en posición de elegir. En ambos casos el resultado es el mismo. Mi recomendación es que, dado que optamos en este caso por acceder a los resultados mediante el acceso a las celdas (y no directamente a los controles), continúes con esa misma lógica y utilices las funciones Calc todo lo que te sea posible. Es necesario saber utilizar estas funciones y en este caso hacerlo no sólo mantiene la coherencia con el planteamiento de trabajo; además supone un ahorro de tiempo.
13 Este proceso puede resolverse de otras formas, pero para los que nos interesa ahora es suficiente con la forma en que aquí se desarrolla. Respecto a la opción a elegir (el uso de funciones Calc vs. código OOo Basic remito a lo dicho en la nota anterior.

No hay comentarios:

Publicar un comentario

Comenta esta entrada