Ítem gráfico (3). Panel de imágenes.
En este caso, la solución más simple consiste en repetir la lámina de respuesta tantas veces como preguntas se formulen. De este modo el problema se reduce a un ítem de opción basada en imagen, como los que [ya vimos en esta entrada]; pero cuantos más ítem compartan el soporte de respuesta, menos funcional se vuelve esa solución, que no lo es en ningún caso, ya que sobrecargamos innecesariamente nuestro docap con imágenes repetidas y, en su caso, también con código redundante.
Disponemos de un procedimiento que elimina la necesidad de repetir las láminas de respuesta y que permite simplificar el código de forma significativa. Veamos en qué consiste; pero antes nos vamos a poner en situación para facilitar la comprensión del procedimiento.
El docap de un test como el Peabody (por poner un ejemplo) se resuelve mediante el procedimiento propuesta en la entrada dedicada al [ítem gráfico de elección de imagen], ya que en cada ítem cambia el conjunto de imágenes entre las que se encuentra la respuesta correcta; pero un test como ITPA-CA (Comprensión Auditiva) presenta el mismo conjunto de seis imágenes para un grupo numeroso de ítem. Esto permite que podamos usar el mismo mapa o conjunto de (aquí) seis imágenes, siempre que independicemos el uso de la imagen del ítem. Me explico:
- Cada ítem tiene seis (o las que sean) opciones de respuesta.
- Para un conjunto de ítem esas seis opciones son las mismas, aunque para cada ítem sólo una de ellas es la correcta
- Las imágenes configuran lo que llamo un panel de imágenes, el cual se puede construir como sumatorio de imágenes independientes o como imagen única sobreponiendo una forma transparente (o semitransparente) sobre cada una de las escenas en que se divide dicha imagen única.
- Dada imagen independiente, o cada forma superpuesta se asocia a un script que emite como resultado de la pulsación un valor (código numérico o letra) que se recoge como respuesta a cada uno de los ítem: una respuesta por ítem.
- Posteriormente, mediante funciones LO-Calc o mediante código, se valora si la respuesta dada a cada uno de los ítem se ajusta a lo esperado (es correcta) o no (es incorrecta) y, en función de ese juicio, se puntúa según el procedimiento establecido (ITPA-CA -> 0 vs. 1)
Como sucede en otras ocasiones en las que se describen procedimientos, su explicación puede resultar más compleja de lo que supone su ejecución. Me temo que este es uno de esos casos; y espero que la presentación del soporte y de su código, lo cual muestro a continuación, sirvan para aclarar las dudas que pudieran quedar.
Sub img1
Dim Lamina As string
Dim img As integer, nit As Integer
Lamina = "Lamina1"
img = 1
nit = 16
puntuar(Lamina,img, nit)
End Sub
Este procedimiento se repite con cada una de las imágenes, luego hay seis script, uno por cada sección del panel (en realidad por cada figura semi-transparente superpuesta)
La función del script es asignar contenido a una serie de tres variables (Lamina, img y nit)...
- Lamina identifica la hoja de cálculo a la que acceder (Lamina = "Lamina1")
- img designa a la imagen (sección del panel) que se está pulsando (img = 1)
- y nit identifica el número de ítem asociados a este panel (nit = 16)
... y con ellas definidas como parámetros, pasar esos valores a la subrutina (función, se diría en otros lenguajes) (puntuar(Lamina,img, nit)) que es la que ejecuta el procedimiento que sigue.
Sub puntuar (Lamina as String, img As integer, nit As Integer)
Dim oHoja As Object, oCelda As Object
Dim Celda As Integer
Dim i As integer
oHoja = ThisComponent.getSheets().getByName(Lamina)
For i = 0 To nit
N = "N" & i + 4
oCelda = oHoja.getCellRangeByName(N)
Celda = oCelda.getValue()
If Celda = 0 Then
oCelda.setValue(img)
Exit For
End If
Next
End Sub
Lo interesante de este procedimiento es que una única subrutina da servicio a estos seis script y a todos los que sean necesarios. Concretamente en ITPA-CA, a un total de 18 script con los que respondemos a un total de 50 ítem. Vemos como funciona.
- Tras acceder a la hoja sobre la que vamos a trabajar (oHoja = ThisComponent.getSheets().getByName(Lamina)) mediante el parámetro Lamina
- desarrollamos un bucle for que tiene como límite superior el valor del parámetro nit (For i = 0 To nit), que indica tanto el número de ciclos del bucle como el número de ítem a los que vamos a responder.
- Nos posicionamos en la celda que nos interesa (inicialmente N4) mediante la fórmula N = "N" & i + 4 que asocia el identificador numérico de la celda con el valor del contador i
- Y a partir de esta posición, capturamos ese objeto celda (oCelda = oHoja.getCellRangeByName(N)) y su contenido (Celda = oCelda.getValue())...
- ... condicionando la acción a desarrollar mediante if a que esa celda esté vacía (If Celda = 0 Then).
- Esa acción consiste en escribir en la celda el identificador de la imagen (img) que hemos pasado como parámetro (oCelda.setValue(img)) y salimos del bucle (Exit For)
- En caso de no cumplirse esa condición, esto es, que la celda no esté vacía, continua desarrollándose el ciclo, esto es: no se escribe nada en la celda (evitando así sobre-escribir en una celda) y se pasa a la siguiente.


