figura5: "Una prueba de uso de Dropdownlistr"
utility nada1 "Probando Dropdownlist"
(
label help1 "Probando Dropdownlist"
dropdownlist objeto "Lista de Objetos" items:#("esfera", "caja", "pyramid", "teapot")
on objeto selected i do
(
a= "has seleccionado "+objeto.items[i]
print a
)
)
Para dropdownlist se emplea el evento selected por el cual, cuando el usuario selecciona un elemento de la lista items, se dispara la ejecución de las sentencias encerradas entre los paréntesis del controlador de eventos (la sentencia on). (Con selected también se devuelve el número de item elegido y dicho número se guarda en la variable escrita después de selected). Una vez hecha la elección, el recuadro desplegable se cerrará y el elemento escogido permanecerá visible en el cuadro inicial. En la Figura 5 el script simplemente imprime en el oyente el elemento elegido por el usuario (pero podríamos emplear el elemento elegido para hacer cualquier otra cosa).
Combobox: este tipo de elemento IU es una variante de dropdownlist. De hecho, combobox funciona exactamente igual cuando empleamos el evento selected. La única diferencia visible inicialmente estriba en que utilizando combobox se emplea desde el principio el recuadro desplegable que en dropdown aparece al hacer clic. El formato a usar es...
Combobox Variable_de_acceso ("string" items:#(lista_de_strings) selection:número height:altura_caja)
El formato es idéntico al empleado en dropdownlist (y los campos cumplen también la misma función) y es que, como ya hemos dicho, combobox es muy similar a dropdownlist. Por esta razón en el ejemplo anterior nos bastaría con sustituir los términos dropdownlist por combobox sin hacer nada más para que el ejemplo siguiera funcionando perfectamente. No obstante hay una diferencia: en Combobox podemos usar algunos eventos adicionales que son...
1) doubleclicked: este evento se produce cuando el usuario efectúa un doble clic sobre algún ítem de la lista (selected funciona con un único clic). Aunque el nombre del ítem cambie en el recuadro titular con un solo clic, las sentencias del controlador de eventos no se ejecutarán a menos que se produzca un doble clic.
2) Entered: las sentencias incluidas dentro del controlador se ejecutan cuando el usuario cambia el texto del ítem escogido y pulsa luego sobre otro ítem. (Esto no sucede si el usuario pulsa Enter después de alterar el ítem). El nuevo texto es devuelto en la variable que sigue a la palabra entered.
3) Changed: el controlador de eventos hace que se ejecuten sus sentencias cuando el usuario realiza cualquier cambio en la caja de selección o pulsa Enter. Como antes, el nuevo texto es devuelto en la variable de la línea del controlador (la que sigue a changed).
Listbox: este elemento IU es otra variación de dropdownlist. Como sucede en Combobox, la lista escrita en el campo ítems queda completamente visible para el usuario desde el principio (o sea que la caja de selección aparece ya maximizada), pero aquí no hay un recuadro principal como cabecera de la lista. El formato de Listbox es el que sigue:
Listbox Variable_de_acceso ("string" items:#(lista_de_strings) selection:número height:altura_caja)
En la Figura 6 tenemos un sencillo ejemplo de uso de listbox.
figura6: "Una prueba de uso de Listbox"
utility nada1 "Probando Listbox"
(
label help1 "Probando Listbox"
listbox objeto "Lista de Objetos" items:#("esfera", "caja", "pyramid", "teapot", "yuyu")
height:7 selection:3
on objeto selected i do
(
a= "has seleccionado "+objeto.items[i]
print a
print i
)
)
Por último, hay que tomar nota de que con listbox podemos usar los tipos de eventos selected y doubleclicked ya explicados para combobox. Y en ambos casos el tipo de valor devuelto (y almacenado en la variable que sigue al nombre de evento) es el mismo.
Edittext: este elemento IU se utiliza para crear recuadros de entrada de textos que el usuario puede emplear para escribir o editar textos. El formato es este:
Edittext Variable_de_acceso ("string" text:texto fieldwidth:ancho_entrada bold:valor_booleano)
"string" es la cadena de texto que aparecerá delante del recuadro de datos, text se usa para poner el texto que aparecerá por defecto en el recuadro de edición (si no incluimos este campo, entonces el recuadro aparecerá vacío), en fieldwidth pondremos la máxima capacidad en caracteres para la entrada de datos y en bold escribiremos un valor booleano, es decir, true (verdadero) o false (falso). Fijaos en el ejemplo de la Figura 7.
figura7: "Una prueba de uso de Edittext"
utility nada1 "Probando Edittext"
(
label help1 "Probando Edittext"
edittext nombre_objeto "tipo de edificio:" text:"castillo medieval" fieldwidth:70 bold:false
on nombre_objeto entered text do print text
)
En este ejemplo, el recuadro aparece con el texto "castillo medieval". La longitud del recuadro no es de 70 caracteres ya que el campo fieldwidth se refiere a la longitud máxima del texto a escribir y no a la longitud del recuadro. Esto implica que el texto se desplazará cuando el usuario, al escribir o editar, exceda los márgenes del recuadro. En cuanto a bold, su valor puesto a false hace que el texto aparezca en formato normal (cuando este campo está a true, entonces el formato es bold). En el ejemplo hemos utilizado el tipo de evento entered, mediante el cual el controlador de eventos ejecuta su bloque de sentencias cuando el usuario pulsa la tecla de Enter, aunque no se hayan efectuado cambios en el texto del recuadro. Pero con Edittext también podemos emplear el evento changed por el cual el controlador ejecutará sus sentencias en cuanto el usuario cambie cualquier carácter del texto del recuadro. En nuestro ejemplo el controlador de eventos sólo ejecuta una orden de impresión cuando se produce el evento, así que hay que tener abierto el oyente para comprobar su funcionamiento. Por último, hay que recordar que, tanto en el caso de changed como en entered, se devuelve el texto alterado en la variable que sigue al nombre del evento (en nuestro ejemplo esta variable se llama text).
ProgressBar: con este elemento podemos crear las típicas "barras de progresión de procesos". El formato a usar es...
Progressbar variable_de_acceso (value:estado_inicial color:color_barra orient:orientación_progreso)
El campo value se utiliza para indicar el estado inicial de la barra de progreso. Este estado puede oscilar de 0 a 100 y por defecto comienza valiendo cero, el campo color se usa para especificar el color que deseamos para la barra y orient se emplea para especificar la dirección de progreso que puede ser horizontal (orient:#horizontal) o vertical (orient:#vertical).
figura8: "Una prueba de uso de la barra de progreso"
utility nada1 "Probando ProgressBar"
(
label help1 "Probando ProgressBar"
button doit "Process Scene"
progressbar doit_prog color:red
on doit pressed do
(
local frodo=1000
for i = 1 to frodo do
(
print i
doit_prog.value = 100.*i/frodo
)
doit_prog.value = 0
)
)
Probando este ejemplo podremos darnos cuenta de que la barra se activa con la declaración del elemento progressbar, aunque no hemos escrito ningún controlador de eventos para ella. Simplemente, al pulsar en el botón ejecutaremos una línea incluida en su controlador de eventos. Esta línea es "doit_prog.value = 100.*i/frodo" y se ejecutará una vez por cada pasada del bucle for, actualizando así la propiedad value que controla el estado de la barra.
Con este tipo de elemento IU podemos emplear también el tipo de evento clicked, el cual devuelve en la variable que sigue a esta palabra (en el controlador de eventos) un valor con el porcentaje de avance de la barra.
Spinner: este tipo de elemento permite crear recuadros de entrada de datos numéricos que incluyen flechas de incremento/decremento. El usuario puede utilizarlos para introducir valores por teclado o para modificarlos utilizando las flechas. El formato de uso es el que sigue:
Spinner variable_de_acceso (range:[minimo, maximo, valor_inicial] type:tipo_spinner scale:valor_flotante fieldwidth:entero)
El parámetro range se emplea para especificar los valores mínimo, máximo e inicial para la entrada de datos mientras que el valor dado a scale se utiliza para controlar los incrementos o decrementos de valor que obtiene el usuario al mantener pinchadas las flechas del recuadro. En type especificaremos el tipo del spinner, que puede ser #float, #integer o #worldunits (siendo por defecto #float) y en fieldwidth indicaremos el ancho en pixeles del recuadro (que no podrá exceder el ancho libre que nos deje el texto-titulo del spinner).
El campo más complejo de explicar es el de controller porque se refiere a aspectos de MAXSCript que aún no hemos estudiado aquí y que tocan nuevos tipos de datos y el tema de la animación. Por ahora nos limitaremos a explicar que este campo se usa para atar el valor actual del recuadro a un parámetro que se especifica con este campo. Podemos ver un ejemplo de esto en el listado de la Figura 9, donde se supone que, previamente al uso del script, hemos creado una esfera de nombre ball. En este ejemplo tomado de la propia documentación de MAXScript se ata micontrolador (el campo controller) al radio de la esfera (con $ball.radius=micontrolador.value) de manera que cualquier cambio en el valor del recuadro tiene como consecuencia el cambio del radio de la esfera y el redibujado de la misma.