Issue with %0 placeholder when the input box change to a blank input

Pablo Gonzalez Mora shared this question 1 year ago
Answered

I am setting a quiz applet. The pupil should write the answer in an input box (valid range: -5 to 5). If the quiz is evaluated (boolean object == true), the answer won't change, else (boolean == false) the answer will change. I use GeoGebra script, with %0 placeholder for the inputbox. I have an issue: if the input changes from any value (valid or not valid) to an empty answer, I got an error message:

"Error in script at the line 1 (called from InputBox1)

Please check your input".

The error is in the command: SetValue(a, "%0")

I have added the following line, but the error remains (just at this line, even with isEvaluated == true):

If(IsEvaluated == false ∧ Length("%0") > 0, SetValue(a, "%0"))

I have several days trying to solve this issue. Could you help me with a suggestion to avoid this error?

P.S. English is not my mother tongue; please excuse any errors on my part.

Comments (15)

photo
1

creo que intentas decir como quieres hacer algo más que decir lo que quieres hacer. es evidente que el error está en que no se puede usar un objeto inexistente como parámetro de una comparación o asignación

creo que lo que intentas es fácil pero no me queda claro qué pretendes. es algo así como que si escriben en la entrada un numero este numero se almacene en a pero que si escriben otra cosa que no sea un numero o lo dejan vacío entonces a no es modificado? si es eso lo más fácil es usar la actualización del texto con un simple script como te adjunto

supongo que no conocías parsetonumber()

sobre el inglés no estamos fuertes casi ninguno

photo
1

Gracias, mathmagic, por tu pronta respuesta.

La aplicación debería contener un botón Evaluate, visible en todo momento, para que el alumno verifique su respuesta (en esta applet resumida, represento el botón con el valor lógico isEvaluated). El objetivo es evitar que el estudiante cambie su respuesta una vez evaluada.

Para ello, tal como lo infieres, se busca que al ingresar un valor en la casilla de entrada, se almacene en a y en textAnswer1' (que es usada como variable auxiliar). Este valor se almacena cuando el booleano isEvaluated == true (dependiente del botón Evaluate). Si isEvaluated == false, tanto textAnswer1' como a mantienen su valor anterior (respuesta inicial del alumno).

Mañana revisaré nuevamente los foros How to Block answers form an Input Box y ¿Cómo bloquear una respuesta a una Casilla de Entrada? Admito que mi versión modificada de la aplicación propuesta por ccambre en el primer hilo funcionó muy bien, salvo este error, y olvidé dar un vistazo al camino ya andado. Seguramente me estoy ahogando en un vaso de agua insistiendo en usar el placeholder %0.

El parsetonumber() lo tengo contemplado para la validación numérica, que es el siguiente paso del applet. Mas, la verdad, no lo había considerado para solucionar el error actual.

Sin embargo, me sigue quedando una duda respecto a la línea de guión: If(IsEvaluated == false ∧ Length("%0") > 0, SetValue(a, "%0")). Si las condiciones no se cumplen (ninguna de las dos), ¿cómo es que la instrucción SetValue(a, "%0") se evalúa y se obtiene el error?

Te reitero mi agradecimiento.

PD: Si colocaste algún archivo adjunto, no lo recibí.

photo
photo
1

el adjunto se me olvido adjuntarlo y lo he desecho porque todo lo que subo va al archivo foro.ggb y me lo voy cargando

creo que lo mejor para evitar cambios después de una evaluación es hacer desaparecer de pantalla las lineas de entrada y sustituirlas por un texto. así no te la pueden cambiar. o sea que al clicar el boton se hacen unos pocos setvisibleinview y no hay más que hablar.

reharé el archivo a ver si te lo puedo enviar

en cuánto a la pregunta es posible que la rutina del script empiece por definir las variables que va a nesitar a lo largo de todo el proceso y luego ejecute la rutina que las maneja (es habitual empezar así cualquier cosa), si en ese momento se encuentra con una variable que no puede asignar te daría un error; pero eso solo puede asegurar algun developer

photo
1

Saludos, @mathmagic. Gracias por tu enorme colaboración.

En cuanto a ocultar las casillas de entrada y reemplazarlas por texto, esta técnica ya la consideró mi compañero de equipo. Aunque es fácil de implementar, no funciona bien en Venezuela (no tengo suficiente criterio para afirmar que por problemas de nuestro Internet): al rato, sin que ninguna instrucción lo solicitase, la casilla que se había ocultado previamente vuelve a aparecer.

photo
photo
1

he pensado que quizas el problema venga de que se intente hacer primero una sustitución de %0 por un valor concreto y depués ejecutar el script resultante. esto tiene más sentido

te adjunto cómo haría yo lo que describes en tu post. espero que no se me olvide

sería un detalle marcar en rojo el input o algo así para desencanto del personal

Files: foro.ggb
photo
1

applet trabaja muy bien. Muchas gracias.

Mi aplicación conlleva un botón New Problem, así que estoy viendo cómo lograr que text1 pueda llegar a ser una cadena de caracteres vacía, para cuando la situación corresponda a un nuevo caso.

Una consulta: ¿Qué función cumplen las comillas "" que preceden al objeto numérico a en tu línea de guión

If(IsDefined(b)&&¬evaluado,SetValue(a,b),SetValue(text1,""a))
?

photo
1

convertir el numero 45 en la cadena de texto "45" si tu escribes por ejemplo " el valor de a es "a la primera a es la letra a y la segunda es el valor de la variable a así que ""a es el valor de a como texto sin nada delante. por eso para que "45" sea un numero hace falta la instrauccion parsetonumber()

para el botón simplemente pon setvalue(text1,"") y para conservar el a de ese momento pon por ejemplo if(n==1,setvalue(answer1,a))

if(n==2,setvalue(answer2,a)) etcetera

setvalue(n,n+1)

se supone que n empieza siendo 1 y que las answer están definidas

photo
1

Entendido lo de las comillas para convertir texto a número.

La instrucción SetValue(text1, "") desencadenaría el guión On Update de text1. ¿Podrías, por favor, chequear mi propuesta en el applet adjunto, con la incorporación de otras entidades e instrucciones?

No se requiere conservar los valores de a.

Muchísimas gracias por tu ayuda.

photo
1

no encuentro problema en lo que he mirado salvo que se espere un comportamiento distinto al que veo

dudo que setvalue en un script desencadene el guion onupdate de text1. creo tener entendido que para evitar la generación de bucles infinitos un setvalue en un script no genera el funcionamiento de otro script. si ves que no te funciona debes ejecutar condicionalmente el script que quieres usando un if(<condicion>,runupdatescript(<object>))

photo
1

Adjunto applet con únicamente la incorporación de la instrucción SetValue(text1, ""): la casilla de entrada no se vacía.


Muchas gracias por el dato del comando runupdatescript. Me será de gran utilidad, junto con runclickscript.

photo
1

he hecho algunos cambios porque tu setvalue llamaba al update de text1 y la condicional de la 2ª linea lo deshacia. lo tipico de los bucles en llamada

han sido rapidos, espero que estén bien

Files: foro.ggb
photo
1

Saludos, mathmagic.

Disculpa mi demora en contestar. El diseño del contenido de las evaluaciones me había tenido algo ocupado.

Tu applet funciona muy bien y es mucho más fácil de programar que la propuesta que yo había elaborado.

Muchas gracias por tu ayuda.

photo
1

Atte. Pablo

photo
photo
1

This command might help avoid the error:


https://help.geogebra.org/e...

eg

ParseToNumber( textAnswer1',"%0" )

photo
1

Thanks, Michael.

photo
© 2020 International GeoGebra Institute