Dudas con la propiedad Intervalo de cronometro y el evento Al cronometro

Estoy diseñando una BBDD en Access 2007 que permita realizar el típico juego de preguntas y respuestas. Para ello dispongo de una tabla (TABLA) con los campos ID, PREGUNTA, RESPUESTA y un formulario con 3 cuadros de texto y 2 botones, uno para iniciar el juego y otro para cerrarlo.

Lo que pretendo es que al cargarse el formulario únicamente se vea el botón de iniciar el juego y que al pulsar sobre él aparezca el primer cuadro de texto con una pregunta de la tabla elegida al azar. Tras esperar 5 segundos, aparezca el segundo cuadro de texto con la respuesta correspondiente y el botón SALIR. Ahora esperamos otros 3 segundos y desaparece el 2º cuadro de texto y vuelve a aparecer el primer cuadro de texto con una nueva pregunta y así sucesivamente.

El tema de elegir la pregunta aleatoria lo he resuelto mediante este código:

Dim intRecords, intNumber As Long, x As Long
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Randomize
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("SELECT * FROM TABLA", dbOpenSnapshot)
With rst
If Not .EOF Then
.MoveLast
.MoveFirst
intRecords = .RecordCount
intNumber = Int(Rnd * intRecords - 1) + 1
.Move (intNumber)
Me.Texto0 = .Fields("PREGUNTA")
Me.Texto2 = .Fields("RESPUESTA")
.Close
End If
End With
Set rst = Nothing
Set dbs = Nothing

Pero no consigo solventar el problema de la espera de los 5 y de los 3 segundos ya que he probado con la propiedad Intervalo de cronometro y el evento Al cronometro pero lo único que he logrado es que ambos cuadros de texto salgan a la vez cada x segundos.

Si solucionar esta cuestión para vosotros es fácil, aprovecharía para complicarla un poco más haciendo que en el mismo formulario apareciera un contador digital que indique los segundos que faltan desde que sale el cuadro de texto primero hasta que salga el segundo (5-4-3-2-1-0 -> sale el 2º cuadro de texto).

1 respuesta

Respuesta
1

Lo del contador atrás no es difícil, pero te lo dejo como ejercicio. Si tengo el formulario que has dicho, al que le añado un cuadro de texto llamado Contador, que estaría oculto pero que lo dejo visible para que veas como funciona. Tampoco entro en como "localizas" las preguntas. Cuando lo abro

En el momento que pulso el botón empieza a contar

Cuando llega a 5 muestra el botón Cerrar y la respuesta

Y cuando llega a 8 el contador se vuelve a cero y oculta lo que debe ocultar

En este caso el código del evento al hacer clic del botón iniciar es

Private Sub Iniciar_Click()
Me.TimerInterval = 1000
Texto2.Visible = True
Aquí iría lo de la pregunta aleatoria
End Sub

Y en el evento Al cronómetro

Private Sub Form_Timer()
Contador = Contador + 1
If Contador = 5 Then
Texto4.Visible = True
texto4=dlookup("respuesta",preguntas","pregunta='" & me.texto2 & "'")
Cerrar.Visible = True
ElseIf Contador = 8 Then
Texto4.Visible = False
Cerrar.Visible = False
Contador = 0
End If
End Sub

Es decir, que cuando Contador llegue a 5 haga visible la respuesta y ponga el valor que figura en la tabla Preguntas para la respuesta que figura en el Texto2 y cuando hayan pasado tres segundos, es decir, Contador llegue a 8, oculta Cerrar, la respuesta y vuelta a empezar.

De todas formas me vas a permitir que haga un comentario sobre la instrucción que tienes. Me parece excesivamente larga. En un ejemplo que tengo para evaluación de alumnos, para tener preguntas aleatorias basta con

Dim numRegs As Long
numRegs = Me.Recordset.RecordCount
Randomize
DoCmd.GoToRecord , , acGoTo, Int(numRegs * Rnd + 1)

Muchas gracias Julián por tu respuesta pero tengo una duda.

El código que me has enviado funciona perfectamente en cuanto a la aparición de los cuadros de texto y botones en su momento pero o algo estoy haciendo mal o cuando el contador llega a 8 por primera vez no cambia la pregunta del primer cuadro de texto por la siguiente aleatoria.

Gracias.

No quise decir nada de lo de las preguntas porque todo depende de como tengas construida la tabla, Así que he supuesto que tienes una tabla Preguntas con un campo Pregunta y otro campo Respuesta. Bien, más o menos como en la imagen

pues con ella construyo el formulario de arriba

Cuando pulso el botón de iniciar

Cuando Contador llega a 5

Y cuando llega a 8( recuerda que equivale a 0)

Y se repite el proceso, hasta que cierres el formulario. En este case, repito, en este caso en particular le he dicho

Private Sub Form_Load()
Cerrar.Visible = False
Pregunta.Visible = False
Respuesta.Visible = False
Contador = 0
End Sub
Private Sub Form_Timer()
Contador = Contador + 1
If Contador = 5 Then
Respuesta.Visible = True
Cerrar.Visible = True
ElseIf Contador = 8 Then
Respuesta.Visible = False
Cerrar.Visible = False
Dim numRegs As Long
numRegs = Me.Recordset.RecordCount
Randomize
DoCmd.GoToRecord , , acGoTo, Int(numRegs * Rnd + 1)
Contador = 0
End If
End Sub
Private Sub Iniciar_Click()
Me.TimerInterval = 1000
Pregunta.Visible = True
End Sub

Por comodidad mía le he puesto que empiece siempre por la primera pregunta de la tabla, y también le he dejado los botones de desplazamiento pero la misma instrucción de Dim numregs...se puede poner en el evento Al hacer clic del botón Iniciar, y en vez de ir a registro ponerle me.recordsource="select pregunta...con lo que cada vez empezaría por una pregunta diferente.

Para el caso de contador inverso y sin calentarte la cabeza puedes poner como oculto Contador y añadir un cuadro de texto visible y en sus propiedades-origen del control

=8-[contador]

O bien hacerlo en código

De todas formas, si necesitas ampliación de la respuesta, como esta página no avisa de eso, te rogaría que me enviaras un mensaje(sólo el mensaje) a [email protected] avisándome de esa circunstancia.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas