domingo, 19 de mayo de 2024

OOo Basic. Interface.

Formularios (b)

Analizo ahora el acceso a los controles de uso más frecuente en un formulario desde OOo Basic, esté creado éste sobre un documento Writer o sobre una hoja de cálculo Calc. Esta entrada complementa, pues, la [entrada anterior] en la que explico la creación del formulario sobre el documento y el acceso a éste mediante código OOo Basic, este sí diferentes según el servicio (Calc o Writer) sobre el que esté implementado.




Los controles de uso más frecuente en un formulario son cuatro (1): Caja de texto, Cuadro de lista, Botón de opción y Casilla (de verificación). Los dos primeros para la entrada de datos y los dos últimos para facilitar la elección de una posible opción de respuesta.

Como ya sabemos, todos los controles de formulario deben ser implementados en el documento-soporte de forma manual (ver [aquísobre la implementación de un formulario Formulario), pero además necesario (o la menos conveniente) conformar la apariencia y forma de funcionamiento de cada uno de esos controles de forma específica. Para ello deberemos acceder a Propiedades del control, opción disponible a partir de la ventana emergente que activamos mediante Selección del control -> Clic derecho sobre el control seleccionado. Una vez dentro de este menú de opciones, podremos configurar nuestro control.

El control Cuadro de texto se comporta funcionalmente como un InputBox(); no obstante presenta características y posibilidades de uso diferentes que las que ofrece InputBox() (2). Para acceder a este control y a su contenido crearemos el código siguiente:

Dim oTxtNombre As Object

Dim sDato As String

 oTxtNombre = oFormulario.getByNa.me("txtAlNombre")

 sDato = oTxtNombre.Text

  • Primero creamos dos variables, la primera (oTxtNombre ) de tipo Object (recuerda que un control es un objeto en LibreOffice) y la segunda (sDato) de tipo String.
  • El paso siguiente es acceder al objeto control (en este caso) por su nombre (una de las opciones que tenemos cuando configuramos el control) mediante la siguiente instrucción: oTxtNombre = oFormulario.getByName("txtAlNombre")
  •  Finalmente, recurriendo al atributo Text del control, accedemos al contenido introducido por el usuario. Asignamos este contenido a la variable String creada al inicio de del código (sDato = oTxtNombre.Text)

El control Cuadro de lista se diferencia del anterior por sustituir la entrada de texto de escritura libre por una lista de datos, presentados como opciones de respuesta para la elección del usuario. Este listado puede crearse directamente desde Propiedades del control -> General -> Entradas de la lista o desde Propiedades del control -> Datos -> Tipos de contenido de la lista opción Lista de valores. Esta segunda forma también permite asociar el control a una tabla, una consulta o a otras opciones de base de datos.

Para acceder al control Cuadro de lista se sigue el mismo procedimiento que para hacerlo a Cuadro de texto, pero no así para el acceso al dato seleccionado por el usuario. Observa el código siguiente:

Dim oCurso As Object, oCursoVista As Object
Dim sCurso As String

oCurso =  oFormulario.getByName("curso")
oCursoVista = ThisComponent.getCurrentController.getControl( oCurso )
sCurso = oCursoVista.getSelectedItem()
  • Primero declaramos dos variables Object para acceder a los objetos control (oCurso) y listado del control (oCursoVista) y una tercera variable, esta de tipo String (sCurso)
  • El uso de las dos variables Object es el siguiente:
    • Mediante la primera (oCurso) accedemos al control como tal (oCurso =  oForm.getByName("curso"))
    • Y mediante la segunda (oCursoVista) a su listado de opciones (oCursoVista = ThisComponent.getCurrentController.getControl( oCurso ))
  • Posteriormente asignamos la opción seleccionada (método getSelectedItem()) a la variable String, previamente declarada (Dim sCurso As String) haciendo uso de ese método (sCurso = oCursoVista.getSelectedItem())
El control Botón de opción es en realidad un conjunto (de al menos dos controles del mismo tipo vinculados entre sí; ambos ofrecen al usuario la posibilidad de elegir uno de ellos como opción seleccionada (el o los otros se descartan), por lo que el conjunto presenta un comportamiento similar al del Cuadro de lista en el que el usuario opta por una de las opciones que se le presentan), aunque en su apariencia formal y su funcionamiento son muy diferentes.

También es diferente el modo en que se accede a la opción seleccionada, requiriendo Botón de opción un manejo similar al que hacemos del valor que devuelve la función MsgBox() (3).

        Dim oBtn1 As Boject, oBtn2 As Object
Dim sSexo As String
oBtn1 = oFormulario.getByName("btn1")
oBtn2 = oFormulario.getByName("btn2")
If oBtn1.State() Then
sSexo = "Niño"
End If
If oBtn2.State() Then
sSexo = "Niña"
End If
MsgBox "Sexo": " & sSexo

El acceso al "contenido" en Botón de opción es en realidad la captura de su pulsación por el usuario (oBtn1 = oFormulario.getByName("btn1")), y se requieren tantas variables como botones de opción contenga nuestro conjunto de opciones. Por ejemplo, en este caso, sólo dos (oBtn1 y oBtn2): el primero capturar la pulsación del botón btn1 (oBtn1 = oFormulario.getByName("btn1")) y el segundo la del botón btn2 (oBtn2 = oFormulario.getByName("btn2"))

Al hacerlo capturamos también sus métodos y propiedades, en concreto el método  State(), que presenta dos opciones (0|1), dado que es de tipo Boolean. Por ello es posible valorar el estado del botón mediante el condicional If. En función del resultado del análisis del estado (State()) de los diferentes botones que componen ese conjunto, asignamos un valor u otro a una segunda variable (en nuestro caso sSexo que es de tipo String) que es la que contendrá la información relevante para el desarrollo del script. En nuestro ejemplo se trata de determinar el sexo del alumno (sSexo="Niño" vs. sSexo="Niña"y de informar de ello mediante MsgBox (MsgBox "Sexo": " & sSexo)

Finalmente el control Casilla (de selección o de verificación) se diferencia de Botón de opción en su forma externa (se representa como un cuadradito en vez como círculo) pero se asemeja en el código necesario para acceder al control y a su estado (de nuevo el método State()). 

Otra diferencia entre ambos es que Casilla no es opcional-excluyente cuando se presenta en agrupamientos, lo que implica que el usuario puede marcar cada uno de estos controles de forma independiente, cosa que no sucede con los botones. De hecho una presentación posible de Casilla es como control único de confirmación del cumplimiento de una condición (Vg. ¿Es correcta esta contraseña?). Otra es, como dije, formando agrupamientos, como en el ejemplo que sigue (4).

        Dim oCasilla1 As Object, oCasilla2 As Object, oCasilla3 As Object
        Dim iPuntos As Integer

iPuntos = 0 

        oCasilla1 = oFormulario.getByName("Casilla1")

If oCasilla1.State() = 0 Then

 iPuntos = iPuntos + 1

End If

En este script, las tres casillas pueden ser seleccionadas independientemente una de otra. De hecho la respuesta correcta implica no seleccionar la primera y sí las otras dos. 

Por lo que se refiere al código de acceso al objeto Casilla como el tratamiento de su estado (State()) es igual que el Botón de opción, como puedes observar comparando ambas instrucciones.

Documentos. Ambos enlaces permiten la descarga del formulario sobre Writer y sobre Calc. Se trata de ejemplificar el uso y [acceso a los formularios], diferente en función del servicio, y a los controles de uso más frecuente (los tratados en esta entrada).


NOTAS 

(1) LibreOffice cuenta con un listado de controles de formulario mucho más amplio, pero estos cuatro cubren la mayoría de las necesidades que buscamos satisfacer con un formulario, de ahí que sean los de uso más frecuente y, por tanto, los que más interés tienen para la creación de un docap basado en Formulario.

(2El manejo de Cuadro de texto requiere el mismo procedimiento de acceso que cualquier otro control de formulario, por lo que no es factible trabajar con él como con InputBox(). En términos de funcionalidad, Cuadro de texto permite opciones de configuración que no están disponibles en InputBox() (que en esto es muy limitado); destaco por su utilidad la posibilidad de configurarlo multirrenglón, además de los formatos de texto (incluido tamaño de letra). Estas opciones de configuración permiten un uso muchos más amigable y funcional como interface, si bien requiere un trabajo previo de configuración desde Propiedades del control.

(3) También en este caso deberemos tratar el valor devuelto mediante un condicional If.

(4) Se trata de un fragmento del script real. En él se ejemplifica el acceso a uno de los tres controles Casilla y a su posterior tratamiento mediante el condicional If. El script completo está disponible en el documento que ejemplifica el uso de los controles que se explican en esta entrada.