• No se han encontrado resultados

CrearCuestionario y ContestarCuestionario

N/A
N/A
Protected

Academic year: 2021

Share "CrearCuestionario y ContestarCuestionario"

Copied!
20
0
0

Texto completo

(1)

CrearCuestionario y ContestarCuestionario

La aplicación "El Gran Concurso de Informática" se puede personalizar para construir cualquier Cuestionario, pero la personalización se limita a los programadores de App Inventor. Sólo tú, como programador, puedes modificar las preguntas y respuestas, y no hay manera de que los padres, maestros, u otros usuarios de la

aplicación puedan crear sus propios cuestionarios o cambiar las preguntas del examen (¡A menos que ellos también quieran aprender a utilizar App Inventor!). En este tema, construirás una aplicación que permite a un "maestro" crear cuestionarios utilizando un formulario de entrada. Las preguntas del examen y respuestas se almacenan en una base de datos de manera que "los estudiantes" puedan acceder a una aplicación separada para hacer el examen. En la construcción de estas

dos aplicaciones, podrás dar otro salto conceptual significativo y aprender a crear aplicaciones con los datos generados por el usuario que se comparten entre las aplicaciones y los usuarios.

CrearCuestionario y ContestarCuestionario son dos aplicaciones que funcionan en tándem y permite que un "maestro" cree cuestionarios para un "estudiante." Los padres pueden crear aplicaciones divertidas y curiosas para sus hijos durante un largo viaje por carretera, los

profesores de primaria pueden construir pruebas de matemáticas, y en la universidad los

estudiantes pueden construir pruebas para ayudar a sus grupos de estudio a preparar un examen final. Este tema se basa en "El Gran Concurso de Informática", de modo que si no has completado esta aplicación, debes hacerlo antes de seguir aquí. Vas a diseñar dos

aplicaciones, CrearCuestionario para el "maestro" y ContestarCuestionario para el estudiante.

Con CrearCuestionario:

• El usuario introduce preguntas y respuestas en un formulario de entrada. • Las parejas entradas pregunta-respuesta se muestran.

• Las preguntas y respuestas del examen se almacenan en una base de datos.

ContestarCuestionario funcionará de manera similar a la aplicación "El Gran Concurso de Informática" que ya has construido. De hecho, crearás esta aplicación utilizando "El Gran Concurso de Informática" como punto de partida. ContestarCuestionario se diferencia en que las preguntas serán las que se introdujeron en la base de datos utilizando CrearCuestionario.

(2)

Lo que aprenderás

El Gran Concurso de Informática fue un ejemplo de una aplicación con datos estáticos: no importa cuántas veces hagas la prueba, las preguntas son siempre las mismas, ya que se escriben como parte de la aplicación. Aplicaciones de noticias, blogs, y aplicaciones de redes sociales como Facebook y Twitter trabajan con datos dinámicos, lo que significa que pueden cambiar con el tiempo. A menudo, esta información se genera dinámicamente por los usuarios, la aplicación permite a los usuarios introducir, modificar y compartir información. Con CrearCuestionario y ContestarCuestionario, aprenderás cómo construir una aplicación que se encargue de los datos generados por el usuario.

Aplicaciones con los datos generados por el usuario son más complejas, y los bloques son más abstractos, ya que no se basan en los datos predefinidos y estáticos. Se define la variable lista, pero sin definir elementos específicos. Al programar su aplicación, hay que preveer las listas que se llenarán con los datos introducidas por el usuario final. Este tutorial cubre los conceptos de App Inventor siguientes:

• Los formularios de entrada para permitir que el usuario introduzca información. • Mostrar elementos de varias listas.

• Datos persistentes: CrearCuestionario salvará las preguntas y respuestas del examen en una base de datos web, y ContestarCuestionario las cargará dinámicamente de la misma base de datos.

• Intercambio de datos: podrás almacenar los datos en una base de datos web utilizando el componente TinyWebDB.

Introducción

Conectarse a la página web de App Inventor y empezar un nuevo proyecto. El nombre será "CrearCuestionario" y establezca el título de la pantalla a "CrearCuestionario". Abra el Editor de bloques y tenga su teléfono en la misma Wifi para poder conectar cuando lo necesite.

Diseño de los componentes

Utilice el Diseñador de componentes para crear la interfaz de CrearCuestionario. Al terminar, debería parecerse a la imagen (también hay instrucciones más detalladas después de la instantánea).

Puedes construir la interfaz de usuario que se muestra en la imagen, arrastrando los componentes indicados en la tabla. Arrastra cada componente en la paleta del visor y ponga el nombre como se especifica en la tabla. Tenga en cuenta que puedes dejar los nombres de las etiquetas de la cabecera (Label1 - Label4) como sus valores por defecto (no los utilizarás en el Editor de bloques de todos modos).

(3)

Componente Paleta Nombre asignado Objetivo

Label User Interface Label4 Texto: “Introduzca una pareja Pregunta-Respuesta”

TableArragement Layout TableArragement1 Tabla de las preguntas y respuestas Label User Interface Label1 Texto “Pregunta:”

TextBox User Interface TBPregunta Introducir la pregunta Label User Interface Label2 Texto “Pregunta:” TextBox User Interface TBRespuesta Introducir la respuesta

Button User Interface BEnviar Enviar la pregunta del cuestionario Label User Interface Label3 Texto “Preguntas y Respuestas” Label User Interface EtPreguntasRespuestas Mostrar las preguntas y respuestas TinyWebDB Storage TinyWebDB1 Base de Datos externa

Establecer las propiedades de los componentes de la siguiente manera:

1. Establecer el texto de Label1 a "Pregunta", el texto de Label2 a "Respuesta", y el texto de Label3 por "Preguntas y Respuestas".

2. Establezca el Tamaño de Letra de Label3 a 18 y marque la casilla FontBold. 3. Ponga el Hint el TBPregunta a "Introduce una pregunta" y el de TBResposta a "Introduce una respuesta".

4. Establecer el texto de BEnviar en "Enviar".

5. Establecer el texto de EtPreguntasRespuestas en "Preguntas y Respuestas".

(4)

Añadir comportamientos a los Componentes

Al igual que con la aplicación "El Gran Concurso de Informática", primero definiremos algunas variables globales para la ListaPreguntas y ListaRespuestas, pero esta vez no nos proporcionaremos preguntas y respuestas fijas. La tabla enumera los elementos que necesitaremos para definir las listas

Tipo de Bloque Grupo Objetivo

Variable ListaPreguntas Variables Almacenar las preguntas

Variable ListaRespuestas Variables Almacenar las respuestas correctas Make a list Lists Construir una lista de las preguntas Make a list Lists Construir una lista de las respuestas

Tenga en cuenta que, a diferencia de la aplicación "El Gran Concurso de Informática", las listas se definen sin elementos en las ranuras. Esto es porque con CrearCuestionario y ContestarCuestionario, todos los datos serán creados por el usuario de la aplicación (es dinámica, por los datos generados por el usuario).

Registro de las entradas del usuario

El primer comportamiento que construimos es para controlar la entrada del usuario. en concreto, cuando el usuario introduce una pregunta y respuesta y hace clic en enviar, haremos servir los bloques add ítems to list para actualizar la ListaPreguntas y ListaRespuestas. La tabla enumera los elementos que necesitará.

Tipo de Bloque Grupo Objetivo

BEnviar.Click BEnviar Evento que se produce al pulsar el botón BEnviar Add ítems to lists (2) Lists Asignará cadenas a una lista

TBPregunta.Text TBPregunta La pregunta introducida por el usuario TBRespuesta.Text TBRespuesta La respuesta introducida por el usuario Get global ListaPreguntas Variables La lista de las preguntas

Get global ListaRespuestas Variables La lista de las respuestas

Set EtPreguntasRespuestas.Text EtPreguntasRespuest Etiqueta para mostrar el contenido de las listas Join Text Para juntar elementos de texto

Get global ListaPreguntas Variables La lista de las preguntas para mostrar Cadena ‘:’ Text Para separar las dos listas

(5)

Cómo funcionan los bloques

El bloque add items to list anexa, o añade, cada elemento al final de una lista. como se muestra en la imagen, la aplicación toma el texto que el usuario ha introducido en las cajas de texto TBPregunta y TBRespuesta y anexa a cada una la lista correspondiente. Los bloques add items to list actualiza las variables ListaPreguntas y ListaRespuestas, pero estos cambios aún no se muestran al usuario. La tercera fila de bloques muestra estas listas mediante la concatenación de ellas (join del texto) con dos puntos en medio. Por defecto, App Inventor muestra las listas con paréntesis que las rodean y espacios entre los elementos, de esta manera: (item1 item2 elemento3). Por supuesto, esta no es la forma ideal para mostrar las listas, pero le permitirá poner a prueba el

comportamiento de la aplicación por ahora. Más tarde, vamos a crear un método más sofisticado de mostrar las listas:

Pon a prueba tu app. En el teléfono, escriba una pregunta y la respuesta y haga clic en el BEnviar. La aplicación debe mostrar el único elemento de la ListaPreguntas, dos puntos, y después el único elemento de la ListaRespuestas. Añadir una segunda pregunta y la respuesta a asegurarse que las listas se crean correctamente.

Limpiando las preguntas y respuestas

Como se recordará desde la aplicación "El Gran Concurso de Informática", cuando pasaba a la siguiente pregunta en la lista, es necesario limpiar los resultados de las respuestas de la pregunta anterior. En esta aplicación, cuando un usuario envía el par de pregunta y respuesta, querrás borrar las cajas de texto TBPregunta y TBRespuesta para que estén listos para una nueva entrada en lugar de mostrar los datos anteriores. Para ello, agregue los bloques siguientes en la parte inferior del controlador de eventos BEnviar.Click

(6)

Tipo de Bloque Grupo Objetivo

Set TBPregunta.Text TBPregunta Cuadro de texto para limpiar Set TBRespuesta.Text TBRespuesta Cuadro de texto para limpiar

“ “ (2 veces) Text La cadena vacía para los cuadros de texto

Cómo funcionan los bloques

Cuando el usuario envía una nueva pregunta y una respuesta, se añaden a sus respectivas listas y se muestran. En este punto, ponemos el texto al TBPregunta y TBRespuesta con bloques de texto vacíos, como se muestra en la imagen.

Puedes probar de nuevo tu aplicación para comprobar que pasa ahora cada vez que pulsas al botón Enviar.

Viendo pares pregunta-respuesta en varias líneas

En la aplicación que se ha construido hasta ahora, las listas de preguntas y respuestas se muestran por separado y con el formato predeterminado de visualización de la lista de App Inventor. Así que, si estás haciendo un examen sobre capitales de países y había dos pares de preguntas y respuestas, podría parecer así:

(¿Cuál es la capital de España? ¿Cuál es la capital de Francia?) (Madrid París)

Como se puede imaginar, si alguien crea una prueba bastante larga, puede ser bastante complicada de ver. Una mejor visualización sería mostrar cada pregunta con su

respuesta

correspondiente, con un par de preguntas y respuestas por línea como: ¿Cuál es la capital de España? Madrid

(7)

La tarea es un poco más complicada, ya que está tratando con dos listas. Debido a su complejidad, pondrás los bloques en un procedimiento llamado MostrarPRs, y llamarás a este procedimiento desde el controlador de eventos BEnviar.Click.

Para mostrar los pares pregunta-respuesta en líneas separadas, deberás hacer lo siguiente:

• Utilice un bloque foreach para iterar a través de cada pregunta ListaPreguntas. • Utilice una variable RespuestaIndex de forma que puedas tomar cada respuesta a medida que itera a través de las preguntas.

• Utilice join para construir un objeto de texto con cada pareja pregunta y respuesta, y un carácter de nueva línea (\ n) que separe cada pareja.

Necesitarás los siguientes elementos:

Tipo de Bloque Grupo Objetivo

Variable Global RespuestaIndex Variables Guardar el índice actual al iterar en el foreach “1” Math El número 1 para inicializar la variable (2 veces) Variable Global RespuestaActual Variables Guarda el texto de la respuesta del índice actual Procedure PRs Procedures Procedimiento que imprime en la etiqueta

Set EtPreguntasRespuestas.Text EtPreguntasRespuest Para darle contenido a la etiqueta, aparece 2 veces Set global RespuestaIndex Variables Inicializa el valor de una variable

For each Pregunta in list Control Itera por todos las preguntas

Pregunta En el for each Almacena la pregunta actual del índice Get global ListaPreguntas Variables Coge la lista completa

Set RepuestaActual Variables Asigna valor a esa variable

Select list item Lists Selecciona un elemento de una lista Get global ListaRespuestas Variables Para pasarle la lista a seleccionar

Get global RespuestaIndex Variables Para pasarle el índice a seleccionar de la lista Join Text Para concatenar cadenas

EtPreguntasRespuestas.Text EtPreguntasRespuest Devuelve el valor actual de la cadena “\n” Text Produce un retorno de carro

Get Pregunta En el for each Coge la pregunta que coincide con el índice actual Get global RespuestaActual Variables Devuelve la respuesta del índice

Set Global RespuestaIndex Variables Para asignarle valor a la variable “ + “ Math Bloque que suma dos valores Get global RespuestaIndex Variables Valor actual al que se le suma 1 “1” Math Para ir incrementando el valor del índice

Cómo funcionan los bloques

El bloque MostrarPRs encapsula todos los bloques para mostrar los datos, como se muestra siguiente imagen. Mediante el uso de un procedimiento, no tendremos los bloques de la pantalla más de una vez en la aplicación, y sólo tenemos que llamar a MostrarPRs cuando queramos mostrar las listas

(8)

El foreach sólo le permite recorrer una lista. En este caso, hay dos listas, y hay que seleccionar cada respuesta a medida que avanza a través de las preguntas. Para lograr esto, utilizaremos una variable de índice, como lo hicimos con el Índice de

PreguntaActual en el programa del Concurso de Informática. En este caso, la variable de índice, RespuestaIndex, se utiliza para seleccionar la posición en la ListaRespuestas conforme el foreach va moviéndose por la ListaPreguntas.

RespuestaIndex se pone a 1 antes de que el foreach comience. Dentro del foreach, RespuestaIndex selecciona la respuesta actual de ListaRespuestas, y luego incrementa. En cada iteración del foreach, la pregunta actual y respuesta se concatenan con el la propiedad EtPreguntesRespostes.Text, con dos puntos entre ellos. El ‘\n’ hace el salto de línea para darle mejor formato.

NOTA: En la versión de App Inventor 2, ya se permiten variables locales en lugar de globales. Puedes investigar su uso y modificar la app para que las utilice.

Llamando al nuevo procedimiento

Ahora dispone de un procedimiento para la visualización de las parejas pregunta-respuesta, pero no ayudará a menos que lo llamemos cuando lo necesite. Modifique el controlador de eventos BEnviar.Click llamando a MostrarPRs en lugar de mostrar las listas con el bloque EtPreguntesRespostes.Text. Los bloques DEBERIAN aparecer como se muestra:

(9)

Pon a prueba tu app. En el teléfono, añadir unas cuantas parejas más de pregunta-respuesta. La pantalla debe mostrar cada pregunta con su respuesta correspondiente, y cada pareja de pregunta y respuesta en una línea separada.

(10)

Almacenamiento de las preguntas y respuestas en una base de

datos

Hasta ahora, has creado una aplicación que pone las preguntas y respuestas en una lista. Pero, ¿qué ocurre si la aplicación CrearCuestionario se cierra? Ya debes saber que si no se almacena los datos en una base de datos, se perderán cuando el usuario cierra y vuelve a abrir la aplicación. El almacenamiento de los datos de manera constante permitirá que la aplicación CrearCuestionario pueda ver o editar la última actualización de la prueba cada vez que se abre. El almacenamiento persistente también es necesario para que la aplicación ContestarCuestionario pueda tener acceso a los datos.

Podríamos utilizar el componente TinyDB para almacenar y recuperar datos de una base de datos. Pero en este caso, utilizaremos el componente TinyWebDB. Mientras que TinyDB almacena la información directamente en un teléfono, TinyWebDB almacena datos en bases de datos que residen en la web.

Su aplicación necesita utilizar una base de datos en línea en lugar de una almacenada en el teléfono de una persona. La cuestión clave aquí es que estás construyendo dos

aplicaciones que necesitan tener acceso a los mismos datos, si el CrearCuestionario almacena las preguntas y respuestas en su teléfono, los ContestarCuestionario no tendrán manera de llegar a los datos. Como el TinyWebDB almacena datos en la Web, el ContestarCuestionario puede acceder a las preguntas y respuestas del examen en un dispositivo diferente al del CrearCuestionario.

Este es el esquema general para hacer la lista de datos como son las preguntas y respuestas persistentes:

• Guarde una lista en la base de datos cada vez que un nuevo elemento se añada a la misma.

• Cuando la aplicación se inicia, carga la lista de la base de datos en una variable. Provocar el almacenamiento de la ListaPreguntas y ListaRespuestas en la base de datos cada vez que el usuario cree una nueva pareja. Vamos a añadir los elementos que se muestran en la siguiente tabla para el controlador de eventos BEnviar.Click.

Tipo de Bloque Grupo Objetivo

Call TinyWebDB1.StoreValue TinyWebDB1 Almacenar las preguntas en la Web

“PreguntasFran” Text Tag con el que se guardara la lista en la Web Get Global ListaPreguntas Variables Lista de las preguntas

Call TinyWebDB1.StoreValue TinyWebDB1 Alnacenar las respuestas en la Web

“RespuestasFran” Text Tag con el que se guardara la lista en la Web Get Global ListaRespuestas Variables Lista de las respuestas

(11)

Cómo funcionan los bloques

Los bloques TinyWebDB1.StoreValue almacenan los datos en una base de datos web. StoreValue tiene dos argumentos: la etiqueta que identifica los datos y el valor que son los datos reales que quiere almacenar. Como se muestra en la imagen, la ListaPreguntas se almacena con una etiqueta de "PreguntasFran", mientras que la ListaRespuestas se almacena con una etiqueta de "RespuestasFran".

Sin embargo, para tu aplicación, debes utilizar etiquetas distintas de "PreguntasFran" y "RespuestasFran" (por ejemplo, "PreguntasLuis" y "RespuestasLuis"). Esto es

importante porque estás utilizando la base de datos web predeterminada para App Inventor, y tus datos (la lista de preguntas y respuestas) pueden ser sobrescritos por otros, incluyendo a otras personas siguiendo este curso.

Tenga en cuenta que el servicio web por defecto es compartido entre los programadores de aplicaciones, ya que es sólo para pruebas. cuando estés listo para implementar la aplicación con usuarios reales, deberás configurar tu propio servicio de base de datos privado. Afortunadamente, hacerlo es sencillo y no requiere de programación. Este es el motivo por el que debemos dar un tag para nuestras listas que no esté utilizando nadie más de los que usan el servidor gratuito de prueba que nos proporciona App Inventor.

Pon a prueba tu app. Introduzca una pregunta y respuesta y haga clic en Enviar. Para comprobar si los datos se almacenan en la base de datos como se quiere, abra un navegador y escriba la URL http://appinvtinywebdb.appspot.com en la barra de direcciones. la página que aparece es la interfaz administrativa para la base de datos. Puede hacer clic en la opción-enlace "/ getvalue" e introduzca la etiqueta (por ejemplo, "PreguntasFran") para encontrar su valor. ¿Sus datos aparecen?

(12)

Para cargar datos de la base de datos

Una de las razones que tenemos para almacenar las preguntas y respuestas en una base de datos es para que la persona al crear el cuestionario pueda cerrar la aplicación y abrirlo en un momento posterior, sin perder las preguntas y respuestas previamente introducidas. (Nosotros también lo haremos para que el ContestarCuestionario pueda tener acceso a las preguntas, pero nos ocuparemos de esto más adelante.) Vamos al programa para cargar los bloques de las listas de nuevo en la aplicación de la base de datos web cada vez que se reinicie la aplicación.

Como ya hemos cubierto en los temas anteriores, para especificar qué debe ocurrir cuando una aplicación se inicia, se programa el controlador de eventos Screen.Initialize. En este caso, la aplicación debe solicitar dos listas de la base de datos web TinyWebDB (las preguntas y las respuestas), de modo que el Screen1.Initialize hará

dos llamadas a TinyWebDB.GetValue. Necesitarás los elementos listados en la tabla:

Tipo de Bloque Grupo Objetivo

When Screen1.Initialize Screen1 Se ejecuta al arrancar el programa Call TinyWebDB1.GetValue TinyWebDB1 Pide los datos de las preguntas en la Web “PreguntasFran” Text Tag con el que se había guardado la lista en la

Web

Call TinyWebDB1.GetValue TinyWebDB1 Pide los datos de las respuestas en la Web “RespuestasFran” Text Tag con el que se había guardado la lista en la

Web

Cómo funcionan los bloques

Los bloques TinyWebDB.GetValue, que se muestra en la imagen, funcionan de manera diferente que TinyDB.GetValue, que devuelve un valor inmediato.

TinyWebDB.GetValue sólo pide los datos de la base de datos web, pero no recibe inmediatamente un valor. En cambio, cuando lleguen los datos de la base de datos web, un evento TinyWebDB.GotValue se dispara. También debe programar un controlador de eventos para procesar los datos que se devuelven.

Cuando el evento TinyWebDB.GotValue ocurre, los datos solicitados están contenidos en un argumento con nombre valueFromWebDB. El tag solicitado se encuentra en el argumento tagFromWebDB.

(13)

En esta aplicación, ya que se hacen dos solicitudes diferentes para las preguntas y respuestas, GotValue se disparará dos veces. Para evitar poner las preguntas si ha llegado la ListaRespuestas o viceversa, tu aplicación debe comprobar la etiqueta para ver qué solicitud ha llegado, y después poner el valor recibido de la base de datos en la lista correspondiente (ListaPreguntas o ListaRespuestas). ¡Ahora te estarás dando cuenta de lo útil que realmente son estas etiquetas!

Necesitarás los elementos listados en la tabla para el controlador de eventos GotValue.

Tipo de Bloque Grupo Objetivo

When TinyWebDB1.GotValue TinyWebDB1 Se lanza cuando se reciben los datos de una lista If (exterior) Control Controlar si es la primera vez que se lanza el

programa

Is a list Lists Devuelve true si se le pasa una lista Get valueFromWebDB Parámetro Si lo devuelto es una lista

It-the-else Control Para comprobar que lista ha llegado Compare texts Text Compara dos cadenas

Get tagFromWebDB Parámetro Devuelve el tag que ha llegado de la Web “PreguntasFran” Text Cadena a comparar

Set global ListaPreguntas Variable Para rellenar la lista de preguntas Set global ListaRespuestas Variable Para rellenar la lista de respuestas

If-then Control Para controlar que han llegado las dos listas Length of lists (2) Lists Devuelve el número de elementos de una lista Get global ListaPreguntas Variable Para saber su número de elementos

Get global ListaRespuestas Variable Para saber su número de elementos Call MostrarPRs Procedures Llamada para visualizar la lista en el móvil

Cómo funcionan los bloques

La aplicación llama a TinyWebDB1.GetValue dos veces: una vez para solicitar la ListaPreguntas almacenada y otra vez para solicitar la ListaRespuestas almacenada. Cuando llegan los datos de la base de datos web de cualquier solicitud, el evento TinyWebDB1.GotValue se activa

El argumento valueFromWebDB de GotValue contiene los datos devueltos por la solicitud de la base de datos. Necesitamos el bloque exterior "if" en el controlador de eventos ya que la base de datos devuelve un texto vacío ("") en valueFromWebDB si es la primera vez que se utiliza la aplicación y no hay todavía preguntas y respuestas. Al preguntar si el valueFromWebDB is a list? Se está asegurando que hay algunos datos realmente devueltos. Si no hay ningún dato, puedes pasar por alto los bloques para el su procesamiento porque es la primera vez que se ejecuta la aplicación.

(14)

solicitud ha llegado. La etiqueta de identificación de los datos están en tagFromWebDB: serán tanto "PreguntasFran" o "RespuestasFran". Si la etiqueta es "PreguntasFran", el valueFromWebDB se pone en la variable "ListaPreguntas". En caso contrario (else), se coloca en ListaRespuestas.

Sólo queremos mostrar las listas después de que ambos hayan llegado (GotValue se haya disparado ya las dos veces). Piensa cómo podría saber que es cierto que tiene cargadas ambas listas de la base de datos. Se utiliza un if de prueba para comprobar si la longitud de las listas son las mismas, ya que esto sólo puede ser verdad si ambos ya se han cargado. En este caso, el procedimiento MostrarPRs que has escrito anteriormente es llamado para mostrar los datos cargados.

Pon a prueba tu app. Reinicia la aplicación haciendo clic en

"Connect – Reset Conexion" en el menú y posteriormente vuelva a conectar con "Connect – AI Companion" (si se conecta por Wifi o el sistema que utilice normalmente). Cuando la aplicación se inicia, debe mostrar las preguntas y respuestas previamente introducidas. Si cierra la aplicación y reinicia, la prueba anterior aún tiene que aparecer.

(15)
(16)

ContestarCuestionario: una aplicación para coger el examen de

la Base de Datos

Ahora tienes una aplicación CrearCuestionario que almacenará una prueba en una base de datos web. Construir ContestarCuestionario, la aplicación que carga dinámicamente la prueba, es más sencillo. Puede ser construido con unas pocas modificaciones de lo que has hecho a partir de la aplicación "El Gran Concurso de Informática", ábrela y en el menú Projects selecciona Save Project As y ponga el nombre del nuevo proyecto "ContestarCuestionario". Esto dejará la aplicación "El Gran Concurso de Informática" sin modificaciones, pero le permite usar sus bloques como base para

ContestarCuestionario.

A continuación, realice los cambios siguientes en el Diseñador:

1. Esta versión de CrearCuestionario / ContestarCuestionario no muestra las imágenes con cada pregunta, así que primero eliminaremos las referencias a las imágenes desde la aplicación ContestarCuestionario. En el Diseñador de componentes, seleccione cada imagen desde la paleta de Media y elimínela. Y a continuación, procederemos a la eliminación del componente Image1, que eliminará todas las referencias a él desde el Editor de bloques.

2. Desde ContestarCuestionario trabajará con datos de bases de datos, arrastre un componente TinyWebDB en la aplicación.

3. Como no quieres que el usuario responda, ni haga clic en el BSiguiente hasta que las preguntas están cargados, desmarcaremos la propiedad Enabled del BRespuesta

y BSiguiente.

ContestarCuestionario: La modificación de los bloques de

cargar el cuestionario de la Base de Datos

Ahora modificaremos los bloques de forma que el cuestionario se le cargue al usuario desde la base de datos. En primer lugar, ya que no hay preguntas y respuestas fijas, quitaremos todas las preguntas y respuestas de los bloques ListaPreguntas y

ListaRespuestas. Los bloques resultantes deben aparecer tal como se muestra en la imagen.

(17)

También puede eliminar por completo la ListaFotos, esta aplicación no se ocupará de tratar las imágenes. Ahora modifique la Screen1.Initialize para que llame a

TinyWebDB.GetValue dos veces para cargar las listas, tal como lo hizo en CrearCuestionario. Debe mirar como lo hacen los siguientes bloques:

Finalmente, arrastre un controlador de eventos TinyWebDB.GotValue. Este controlador de eventos debe ser similar al utilizado en CrearCuestionario, pero aquí queremos mostrar sólo la primera pregunta y ninguna de las respuestas. Trate de hacer estos cambios por su cuenta, y luego eche un vistazo a los bloques de la imagen para ver si coinciden con su solución.

Cómo funcionan los bloques

Cuando la aplicación se inicia, Screen1.Initialize se dispara y la aplicación solicita las preguntas y respuestas de la base de datos web. Cuando cada petición llega, el

controlador de eventos TinyWebDB.GotValue se dispara. La aplicación comprueba si hay de hecho los datos de valueFromWebDB utilizando is a list? Si encuentra datos, la aplicación comprobará qué solicitud ha entrado, utilizando tagFromWebDB, y colocará el valueFromWebDB en la lista correspondiente. Si la ListaPreguntas es la que se está cargando, la primera pregunta se seleccionará de ListaPreguntas y se mostrará en la etiqueta que tenemos para ello. si es la ListaRespuestas la que se está cargando, el BRespuesta y BSiguiente serán habilitados para que el usuario pueda empezar a hacer el cuestionario.

(18)

Pon a prueba tu app. Reinicie la aplicación mediante su método normal de probar los programas. ¿Aparece la primera pregunta de su cuestionario CrearCuestionario? ¿Se puede hacer un examen, tal como hizo con el "El Gran Concurso de Informática" (sin las fotografías)?

(19)

Variaciones

Cuando haya terminado CrearCuestionario y ContestarCuestionario, es posible que desee explorar algunas variaciones. Por ejemplo:

• Permita que el CrearCuestionario especifique una imagen para cada pregunta. Por supuesto, el desarrollador de la aplicación no puede precargar las imágenes, y actualmente no hay manera de que el usuario de la aplicación pueda hacerlo. Así que las imágenes deberán ser URL de la web, y el CrearCuestionario deberá introducir estas URL como un tercer elemento en el formulario CrearCuestionario. Recuerde que puede establecer la propiedad Picture de un componente de imagen a una URL.

• Permita que el CrearCuestionario pueda eliminar elementos de las preguntas y respuestas. Puedes dejar que el usuario elija una pregunta utilizando el componente ListPicker, y se puede quitar un elemento de la lista de elementos con el bloque remove (recordad que hay que quitar de las dos listas y actualizar la base de datos).

• Deje que el nombre del CrearCuestionario pueda ser cambiado. Deberá guardar el nombre del cuestionario bajo un código diferente en la base de datos, y deberás cargar el nombre junto con el cuestionario de ContestarCuestionario. Cuando se haya cargado el nombre, lo utilizarás para establecer la propiedad Screen.Title para que aparezca cuando el usuario realice un cuestionario.

• Permite crear múltiples cuestionarios. Necesitarás una lista de cuestionarios, y se puede utilizar el nombre de cada cuestionario como (parte de) la etiqueta para almacenar sus preguntas y respuestas.

Resumen

Estos son algunos de los conceptos que hemos tratado en este tema:

• Los datos dinámicos es información introducida por parte del usuario de la aplicación, o cargados por las bases de datos. Un programa que trabaja con datos dinámicos es más abstracto.

• Puedes almacenar datos de forma persistente en una base de datos web con el componente TinyWebDB.

• Puedes recuperar datos de una base de datos TinyWebDB solicitándolos con TinyWebDB.GetValue. Cuando la base de datos web devuelve los datos, el evento TinyWebDB.GotValue se dispara. En el controlador de eventos TinyWebDB.GotValue, puedes poner los datos en una lista o procesarlos de alguna manera.

(20)

Licencia

Crear Cuestionario y Consultar Cuestionario de App Inventor 2, por Francisco García Muñoz basado en:

Referencias

Documento similar