Capítulo 4. Objetos y controles básicos

Tabla de contenidos
Botones (button)
Campos de texto (field)
Mapas de bits (image)
Primitivas de dibujo: gráficos vectoriales (graphic)
Vídeo y sonido (player)
Barras de desplazamiento (ScrollBar)
Tarjetas (card)
Pilas (stack) y subpilas
Caso de estudio: una agenda para guardar el historial clínico de pacientes
Ejercicios y actividades

En este documento el concepto de Multimedia se aplica a la definición de las características que exhiben determinadas aplicaciones que, en un soporte informático, utilizan diferentes elementos de naturaleza variada e incluyen los mecanismos de interacción que proporcionen al usuario la misma (en forma de oportunidades de participación y elección de alternativas en el recorrido por los contenidos.

Las herramientas de creación o de autor, son las que facilitan o permiten la creación de una aplicación de características multimedia. Debido a la complejidad de tal desarrollo, por la variedad en cuanto a naturaleza y necesidades de procesado de los objetos que las componen. Son las herramientas de unión que permiten la composición del puzle que es en definitiva una aplicación que busca captar la atención del usuario, mantener su atención con recursos de procedencia variada y acomodarlos a las demandas del mismo.

El planteamiento que se debería realizar siempre de partida es el de:

El seguimiento de la utilización del producto debería incluirse como parte de la labor de producción, aunque en ocasiones esta es una tarea de difícil realización.

Dos son las grandes líneas que en cuanto a estas aplicaciones existen predomina el ámbito de la producción multimedia. En este documento se ha optado por unas herramientas (MetaCard y Revolution) cuyas características permiten moverse entre ambas. Por un lado las basadas en una metodología de creación de ventanas y de disposición de elementos en las mismas (que se abordará con MetaCard y que en la literatura se denominan de card/script), completadas con la descripción de los comportamientos dinámicos en forma de código. Y, por otra parte, las basadas en línea de tiempo (para lo que se empleará el asistente que acompaña a Revolution, que cabe en la denominación de cast/score/script), que permite la realización de animaciones de forma asistida y en las que el transcurrir del tiempo es el principal desencadenante de las acciones. La reunión de ambos planteamientos en un mismo entorno y las cuestiones comentadas en el planteamiento de este documento justifican esta elección.

En la siguiente sección se aborda la utilización de los elementos más básicos de estas herramientas para la realización de aplicaciones de características multimedia. Básicamente, se hará referencia a elementos que constituyen el interfaz de una aplicación.

Este apartado, examina aquellos que se pueden utilizar en MetaCard y Revolution indistintamente. Por defecto se hará referencia a nombres del entorno de desarrollo de MetaCard a no ser que se diga explícitamente lo contrario.

En este punto al lector se le supone que ha seguido la realización propuesta de los tutoriales y el estudio de las MetaClasses, por lo que conoce la terminología básica: conceptos como pilas, subpilas, tarjetas, grupos, botones y campos de texto. Si no es así, cuanto antes lo lleve a cabo ... La intención del presente punto es la de proporcionar una visita rápida a los elementos que se dispone desde la barra de herramientas ("Menu Bar"). Recapitulamos aquí los elementos que puede visitar en las MetaClasses, para pasar a sugerir algunas actividades para trabajar los contenidos de este tema.

Aunque el lector ya se habrá percatado al realizar los tutoriales propuestos, creo conveniente en este punto hacer un pequeño repaso de la nomenclatura que estas herramientas utilizan para hacer mención de un objeto o control:

Es posible, pues hacer referencia a objetos en una tarjeta que no es la presente o a otras pilas que esten siendo utilizadas de manera "remota". Pero no dejemos que esto nos preocupe por ahora. En los siguientes apartados se recogen las propiedades y lso usos que, en la experiencia del autor, se vienen a utilizar con mayor frecuencia.

Botones (button)

Es posible escoger desde las propiedades de un botón (por supuesto también, desde el código) la apariencia de un botón para obtener desde los más básicos como el "Standar", pasando por modelos desplegables (como por ejemplo los "Combo buttons" y "Option buttons"), para implementar un menú ("Menu buttons") o elementos de selección basados en pestañas ("Tabbed buttons"). A modo de recopìlación de posibilidades la Figura 4-1 las muestras reunidas.

Figura 4-1. Tipos de botones disponibles en MetaCard y sus propiedades.

Sugerencia: Por supuesto, todas estas opciones (y, en general, para cualquier objeto de MetaCard) están disponibles en tiempo de ejecución: es posible comprobarlas y modificarlas mediante código. Como mínimo ejemplo de esta circustáncia puede probar el siguiente fragmento de código sobre un botón que haya creado. Póngale un nombre, como por ejemplo "aa" (sin las comillas, ¡ya sabe!). Recuerde que puede hacer uso directament de la "Menu Bar", que para eso está y que la puede lanzar directamente con Ctrl+M.

put the properties of button "aa" into a; answer keys(a)
                     

Los botones son controles que tienen dos estados diferenciados entre los que cambia al ser pulsados (utilizando el ratón) o activados (mediante el teclado, haciendo uso de alguna combinación de teclas o llevando a él el foco del teclado y "pulsandolo" con la barra espaciadora). Distinguiremos entre los que guardan un número de opciones (textuales o gráficas), que llamo desplegables (véase la columna de la derecha del grupo Style de las propiedades de un botón y los de selección.

De selección

En estos se puede distinguir entre los que pueden guardar y representar el cambio de estado y los que no. Entre estos últimos está el botón estándard sus variantes de presentación: "Standard", "Rectangle", "RoundRect" y "Shadow".

Figura 4-2. Botones de selección: mínima aplicación para las pruebas.

La parte de selección de opciones, en general, se implementa con botones de selección múltiple con "Check buttons" o única (también denominada exclusiva) mediante "Radio buttons". Los primeros cambian de estado a cada pulsación, mientras no se cambie ese comportamiento por código claro: véase la diferencia entre el código en la columna izquierda y la derecha de la Figura 4-2. Allí podrá ver junto al ya conocido evento de mouseUp el uso de la propiedad hilite (que no es aplicable por igual a un subtipo y otro de botón) y la orden hilite y unhilite que nos permiten cambiar ese estado (e incluso el comportamiento habitual) por código. La siguiente figura muestra dos conjuntos de código para los botones anteriores que muestran las estas posibilidades comentadas. Pruebe primero el código de la fila superior y compare su resultado con el de la inferior.

Figura 4-3. Botones de selección: propiedad y orden hilite.

                                      Primer conjunto:
# Botón "Radio"                                 # Botón "Check"
on mouseUp                                        on mouseUp
  put the hilite of me                              put the hilite of me
end mouseUp                                      end mouseUp


                                        Segundo conjunto:
# Botón "Radio"                                 # Botón "Check"
on mouseUp                                        on mouseUp
  put the hilite of me                              put the hilite of me
  unhilite me                                       hilite me
end mouseUp                                      end mouseUp
                              

Para que los de selección única funcionen en ese modo exclusivo que les da nombre sólo hay que constituirlos bajo un grupo (como ha podido observar en la metaclase "Groups and Backgrounds"). Pero en determinados casos, cuando la selección no es singular, es necesario que se habilite un punto donde la selección del usuario se considere viable o no.

Por ello, a continuación se muestra un pequeño fragmento de código que permite llevar cuenta en un vector de las opciones escogidas. En ese mismo momento se pueden determinar incompatibilidades u opciones exluyentes que habrá que hacer llegar al usuario en forma de un aviso o sugerencia a gusto del desarrollador.

La Figura 4-4 muestra un conjunto de tres botones de selección multiple agrupados bajo un contenedor genérico de grupo de objetos. Este es quien recoge la pulsación del ratón y en función de sobre qué elemento de su ámbito se ha realizado mantiene actualizado en un campo de texto (para facilitar la visualización) el estado de pulsado o no de los botones que lo componen.

Figura 4-4. Ejemplo de selección mediante botones de selección múltiple.

on mouseUp
  # Quin s'ha pulsat
  put the number of target  - the number of the first button of me + 1 into botoPulsat
  put not the word botoPulsat of field "llistaComponentsActives" into \
      word botoPulsat of field "llistaComponentsActives"
  --  put  field "llistaComponentsActives"
end mouseUp
             

Otro uso habitual de los botones de selección es para incluir o no opciones en un caso que admita esta variabilidad. La Figura 4-5 muestra en primer lugar las propiedades características de uno de los botones que se emplean en el ejemplo, para los cuatro el planteamiento es similar; después el código asociado a cualquiera de ellos y, finalement, una pequeña captura de esta "sociedad" de controles en funcionamiento. Al activar o desactivar uno de ellos en el campo situado en la zona inferior se ve reflejado la aparición de la cadena correspondiente al botón seleccionado. De este manera, en todo momento hay una cadena de texto que refleja la situación de los botones y que, en el caso mostrado, se ha utilizado para crear una línea de órdenes cuya ejecución se le encargará al operativo de la máquina en un instante posterior. En este caso el interés estriba en la forma que se ha implementado la detección del estado de seleccionado (activado) de un botón, así como en la forma genérica del tratamiento.

Figura 4-5. Botones de selección que tratan, de forma dinámica, la activación o desactivación de su estado.

on mouseUp
  get the properties of me
  if it["hilited"] is true
  then
    put (" " & the short name of me) after fld "ordreAExecutar"
  else
    put offset( the short name of me, fld "ordreAExecutar" ) into tOffset
    delete char tOffset to (tOffset + length(the short name of me)) of fld "ordreAExecutar"
  end if
end mouseUp
             

Desplegables

Mención aparte merecen los tipos de botones que permiten implementar menús y otros tipo de objetos que permiten al usuario escoger una opción enter una serie de items. Para estos casos se utilizarán uno de los estilos de los posibles de un botón. Para estos casos se habrá de elegir una de las opciones disponibles a la derecha del menú de estilo de la apariencia de un botón, esto es: Pulldown, Popup, Cascade, Option, ComboBox o Tabbed.

Este tipo de botones hacen uso de la propiedad Menu de un botón. En esos casos es necesario utilizar una serie de propiedades e instrucciones para acceder a los contenidos de los mismos que el lector habrá podido descubrir al examinar la la sección de nombre MetaClasses en Capítulo 1.

Figura 4-6. Ejemplo de botones desplegables.

Como ejemplo de estas características en Figura 4-6 se ilustran los conceptos básicos. El lector puede reconstruir la figura, en la que se utiliza el evento menuPick y el modo de acceder al contenido de una opción escogida (label) en uno de estos botones con el código siguiente: el primero de los siguientes manejadores atiende a la elección realizada sobre un botón (menú) de tipo Option y muestra la opción escogida; el segundo permite recuperar esta en cualquier desde un elemento de la interfaz, para ilustar cómo se puede llevar a cabo esta tarea; y el último de los códigos mostrados ilustra el caso de un botón de tipo Tabbed como, seguramente, el lector ya habrá descubierto en las MetaClasses.

on menuPick opcioNova
 put "Ara: "&& opcioNova 
end menuPick


on mouseUp
  put the label of button ("desplegable" & the short name of me)
end mouseUp
             

Para el caso de los botones de tipo Tabbed y por completitud en este punto por que lo habrá descubierto ya al revisar las MetaClasses, hay recordar que para estos habrá que disponer grupos de objetos que muestren los contenidos adecuados en cada caso. MetaCard se coupará de mostrar la pestaña activa, pero es labor nuestra actualizar los controles accesibles. Por supuesto esta tarea es muy simple si se utilizan los mismos nombres para las diferentes opciones y para los grupos. El código siguiente ilustra el mecanismo básico para esta tarea.

on menuPick opcioNova opcioAnterior
  put "Antes:" && opcioAnterior && "i ara: "&& opcioNova
end menuPick