martes, 14 de mayo de 2024

OOo Basic. Interface

MsgBox (1)

Para la interacción programa-usuario en LibreOffice contamos con diversos recursos; uno de los más sencillos es MsgBox, que en realidad está pensado para mandar mensajes y avisos de distinto tipo, pero que también sirve tanto como recurso de output (2) como de input, en este caso gracias a su uso como función que permite la bifurcación del programa en asociación con estructuras condicionales (If). En este caso se expresa como MsgBox().




Según lo dicho MsgBox cumple doble función Input-Output. Si la empleamos como recurso output muestra algún tipo de información, como en la imagen que sigue...




... pero si la empleamos como input (función MsgBox()) nos devuelve un valor numérico dependiendo del botón de comando que pulsemos, lo que nos permite capturar este valor y darle un determinado significado mediante el código.


Para la correcta configuración de MsgBox() debemos saber que admite varios parámetros, aunque sólo el primero (el mensaje o prompt) es obligatorio, permitiéndolos opciones de mensaje, título, icono y comandos: (3)

MsgBox (Mensaje As String, Tipo As Integer, Titulo As String)

  • Mensaje es el texto que deseamos mostrar. Puede diferenciarse en varias líneas (Chr(13) genera el salto de línea) y podemos sustituir el texto por una variable de tipo String.
  • Título también es de tipo String y, como su nombre indica, nos sirve para personalizar el título que presentará MsgBox().
  • Tipo es un valor Integer (en realidad una clave o conjunto de claves) que permite identificar el conjunto Icono + Botones (de uno a tres) siguiendo una combinación que se puede presentar como sumatorio o como resultado de la suma: en el primer caso, el primer sumando representa el comando o botón activo (4), el segundo sumando representa el código del comando o comandos (botones) que se muestran y el tercer sumando indica el icono que mostrará MsgBox(). Puede haber un tercer sumando que sirve para indicar cual de los dos o tres botones es el seleccionado por defecto. El cuadro que sigue facilita la comprensión del uso de estos códigos:
Sin iconos
  • 0 - Sólo muestra el botón Aceptar.
  • 1 - Muestra los botones Aceptar y Cancelar.
  • 2 - Muestra los botones Reintentar, Ignorar e Interrumpir.
  • 3 - Muestra los botones Sí, No y Cancelar.
  • 4 - Muestra los botones Sí y No.
  • 5 - Muestra los botones Reintentar y Cancelar.
Iconos

  • 16 - Añadir el icono de Stop
  • 32 - Añadir el icono de Pregunta
  • 48 - Añadir el icono de Exclamación
  • 64 - Añadir el icono de Información

Acceso a botones

  • 128 - El primer botón es el predeterminado. También cuando no se usa 128
  • 256 - El tercer botón es el predeterminado cuando hay tres; si hay dos es el segundo.
  • 512 - El mismo funcionamiento que el código 256

Dado que estos códigos funcionan como números, tanto la expresión suma como su resultado tienen el mismo efecto. Por ejemplo:

Para mostrar un MsgBox con los botones Sí - No (código 4) y el icono Pregunta (código 32) con el botón No seleccionado (código 256) la expresión del tipo puede ser indistintamente:

    • 4 + 32 + 256
    • 292
Interesa también plantearse un manejo diferente de estos parámetros (los tres) de MsgBox, ya que, especialmente el mensaje o texto que mostramos en MsgBox pero no sólo él, es susceptible de ser tratado como variable y ésta sometida a decisión en función del desarrollo del algoritmo. Esto confiere a MsgBox una función mucho más dinámica y potente que la de mero recurso para la emisión de avisos circunstanciales.

Cuando empleamos MsgBox como mensaje, normalmente se presenta directamente, seguido del mensaje (MsgBox "Hola Mundo"), aunque también es posible expresar los parámetros de la función (MsgBox "Hola Mundo", 48, "SALUDO UNIVERSAL"). Pero cuando necesitamos capturar el valor del comando pulsado, necesitamos asignar dicho resultado a una variable (vRpt = MsgBox ("¿Es martes?",4,"DÍA DE LA SEMANA"))

Es el manejo posterior de esta variable la que nos permite utilizar MsgBox() como recurso interactivo para el input, ya que podemos asociarla al código de procesamiento. En este caso, MsgBox() queda subsumido e integrado en la estructura decisional del algoritmo. Muestro a continuación un ejemplo:

Dim iRpt As Single, i As Single

Dim mTratm(2) As String 

 iRpt =MsgBox("¿Es niño?,4,"DATOS DEL ALUMNO")

MsgBox iRpt 

If  iRpt = 6 Then

mTratm() = Array ("niño","alumno","el")

ElseIf  iRpt = 7 Then

 mTratm() = Array ("niña","alumna","la")

End If

For  i = LBound( mTratm() ) To UBound(mTratm())

 mTratm(i)

Next 

 MsgBox mTratm(2) & " " &  mTratm(0) & " es " &  mTratm(1) & "..."

Analizo el script:

  • Las variables iRpt tienen que ser números enteros; la primera por razones obvias (MsgBox() devuelve un valor numérico) y la segunda por su función como contador en el bucle For. Además las categorizo como Single dado que esos números son enteros son pequeño, aunque es frecuente declararlas como Integer.
  • La matriz mTratm() cumple aquí la función de resultado de la bifurcación y podría ser sustituida por un conjunto de variables, no necesariamente de tipo String. Su peculiaridad viene dada por los objetivos que se persigan con el script, que en este caso es definir el tratamiento gramatical en función del género (MsgBox mTratm(2) & " " &  mTratm(0) & " es " &  mTratm(1) & "...")
  • Mediante la expresión  iRpt =MsgBox("¿Es niño?,4,"DATOS DEL ALUMNO"),  basada en la función MsgBox() se asigna a la variable iRpt el valor numérico resultante de la pulsación de los comandos "Sí-No" que se indican como segundo parámetro de la función. Los otros dos son el mensaje y el título de MsgBox() tal como se muestra en pantalla.
  • En la línea siguiente (MsgBox iRpt ) se usa MsgBox con funciones meramente informativas (de control del resultado de la función anterior). Es una línea de código que en la versión final del script se puede eliminar o comentar, una vez comprobado el correcto funcionamiento del script.
  • Sigue una estructura condicional (If... ElseIf...End If) que, en este caso "bifurca" el script en términos de expresiones gramaticales de género, dando contenido (mediante el array) a la matriz  mTratm() (mTratm() = Array ("niño","alumno","el")) en función del valor que devuelve el comando pulsado por el usuario (Sí -> 6, No -> 7)
  • Sigue un bucle For cuya función es (en este caso) también meramente informativa, por lo que es prescindible en la versión final de este script. Mediante este bucle recorremos los elementos de la matriz para comprobar que los valores asignados son correctos.
  • Y finalmente aplicamos el resultado del proceso anterior a la composición de un texto mediante concatenación de String y de los elementos de la matriz mTratm(). El MsgBox que nos muestra en pantalla este texto es un ejemplo de su función output.
Se espera del lector que analice y pruebe este script y sea capaz de idear el suyo propio.

NOTAS

(1) Esta entrada sustituye las creadas con fecha 16 de julio de 2023 sobre MsgBox como recurso de Input y de Output a las que sustituye.

(2) Además de MsgBox, e incluso más simple aun, en OOo Basic también podemos usar la instrucción Print (Print("Texto")), aunque lo cierto es que es una instrucción que se emplea muy poco, salvo como forma de comprobación del funcionamiento del código durante su creación.

(3) Además de los números (ver en el texto de la entrada), también podemos emplear expresiones alfanuméricas como las que se indican en la página de ayuda de LibreOffice, si bien por simplicidad son preferibles la expresión numérica de los parámetros.

(4) Este dato puede estar ausente y el orden puede variar sin que afecte al funcionamiento. Si en lugar de pulsar el comando se usa Intro como respuesta, el valor que devuelve la función será el de comando activo, que, en teoría, se define como sigue:128 - 256 - 512 activan respectivamente los botones 1º, 2º y 3º. En la práctica he observado que 128 y 256 activan el primer botón y 512 el segundo. 

No hay comentarios:

Publicar un comentario

Comenta esta entrada