Ejercicios y actividades

En este capítulo, el lector ha podido aprender y practicar sobre:

Unas actividades para empezar:

  1. Vamos a realizar una pequeña modificación sobre un ejemplo ya visto para conseguir una aproximación más funcional: en la línea de la programación orientada a objetos, donde la complejidad de la implementación de un objeto está escondida en este y, hacia afuera, sólo se ven los métodos que sobre aquel se pueden invocar. De esta manera tendrá un esqueleto de objeto que puede realizar una tarea y ser interrumpido en cualqiuer momento, sin necesidad de diseminar código por varios objetos.

    Sobre el ejemplo del reloj en la la sección de nombre Envío de mensajes y cancelación, recoja el código encargado de poner en marcha el reloj y pararlo en el propio campo de texto que lo muestra y reescriba el código de los botones para que únicamente invoquen a esos eventos.

Ahora es todo suyo: empezamos con los ejercicios.

  1. Cree su propia caja de diálogo para mostrar cuatro opciones entre las que el usuario debe escoger una. La elección del usuario, recogida en un campo de texto, será devuelta como resultado. De esta forma se podrá estudiar cómo recoger el resultado de la ejecución del diálogo creado. Para ello habrá de crear su propia pila con el aspecto que desee, y probar a recoger la salida con retval. Puede tomar el esqueleto de la propia ayuda de MetaCard, véase lo referente a la orden modal.

  2. Completando el ejercio anterior, ahora vamos a incluir la posibilidad de pasar información a esa caja de diálogo. Para, por ejemplo, especificar un tiempo máximo en que el diálogo estará presente en pantalla. El resultado devuelto es la opción escogida o vacío (empty) si ha expirado el plazo. La información para la caja de diálogo se le puede pasar utilizando la propiedad dialogData.

Aunque en la la sección de nombre Envío de mensajes y cancelación se ha comentado que al aumentar el número de objetos sería más evidente la desventaja de un bucle repeat frente a la programación de eventos no se deje convencer. Y para que lo practique le propongo:

  1. Introduzca un número mayor de objetos en el caso de experimentación propuesto. Por ejemplo, once más.

  2. Se ha sugerido que existen otras soluciones a la acción concreta de mover varios elementos simultáneamente. Consulte la ayuda de la orden move para reescribir el código del botón que inicia aleatoriamente la posición de los N objetos en la ventana, para que se realicen todos en paralelo.

  3. Otro planteamiento para investigar: la actualización de la posición de un objeto en pantalla siguiendo el movimiento del ratón. Aquí parece claro que un bucle no es demasiado lógica solución puesto que no sabemos cuántos movimientos realizará el usuario. Describa e implemente la situación planteada en términos de eventos a tratar. Como sugerencia, consulte la ayuda sobre el evento mouseMove, la propiedad, mouseLoc, la orden move y, si es my detallista, la orden lock.

  4. Aprovechemos para ver cuestiones relativas al tiempo y así insistir en uno de los ejemplos ya introducidos. Completemos el reloj construido en la sección de nombre Envío de mensajes y cancelación con nuevas opciones, como por ejemplo las que se muestran en la Figura 3-10 y que son:

    • Introducir un control que nos permita alternar entre la visualización de la hora en el formato de 24 y de 12 horas y que el estado actual lo refleje su propio contenido. Para ello utilizaremos la propiedad twelveHourTime, por ejemplo con la instrucción siguiente

           set the numberFormat to "00"
                             
    • Anyadir una opción que funcione como temporizador, esto es que permita introducir una cuenta hacia atrás de tiempo y que lo señale (con sonidos o con una caja de diálogo, por ejemplo) cuando la cuenta alcance su valor final. Aquí puede ser interesante asegurarse que las operaciones siempre devuelven un valor numérico con dos dígitos, para lo que habrá de hacer uso de la propiedad numberFormat

      #
      # Campo de texto "temporitzaor"
      #
      ...
         set the numberFormat to "00"
         put (char 4 to 5 of the text of me) - 1  into segons
         put (char 1 to 2 of the text of me) into minuts
      ...
                             
    • Anyadir una opción que funcione como alarma, es decir, que permita establecer una hora (en formato "hora:minutos:segundos") en la que se de un aviso o notificación. Dos cosas pueden ser de interés para este caso: confirmar que es una fecha y establecer el instante en que se debe avisar (para lo que puede utilizar la orden convert).

      #
      # Campo de texto "alarma"
      #
      ...
        if the text of me is a date
         then
      ...
          convert tempsAra to seconds
          convert instantFinalEnSegons to seconds
      ...
                         
    • Una pequeña pega: ¿qué se le ocurre para poder manejar el caso de que el usuario decida parar el temporizador o la alarma?

    • Para terminar este apartado: ¿qué se le ocurre si el usuario quiere cerrar la aplicación, para poder seguir teniendo en cuenta la alarma a la próxima ejecución del progrma?

    Figura 3-10. Ejemplo de apariencia final de las nuevas funcionalidades.