Componente ComboBox

FlashEn este ejercicio aprenderemos a usar el componente ComboBox que viene incluido en Flash. Este componente nos permite mostrar una lista de opciones, de la cual el usuario podrá seleccionar solamente una opción.

Para este ejemplo usaremos Flash 8. El resultado final y el archivo para descargar los encontrarás al final de este post.

Un ComboBox pertenece a la clase mx.controls.ComboBox de ActionScript.

Tutorial

1. Crea un nuevo documento de Flash de 340 x 415 pixeles.

2. A la única capa que existe ponle de nombre Forma. Coloca en el escenario un texto que diga "¿De que país nos visitas?" (sin las comillas).

3. Abre el Panel Componentes (Ctrl. + F7 o bien en el menú Window -> Components). Dentro de este panel encontrarás una sección llamada User Interface (Interfaz de usuario). Abre esa sección y selecciona el componente ComboBox.

4. Arrastra al escenario cinco de estos componentes. Por el momento no importa cómo los coloques en el escenario, más adelante pondré una imagen de cómo de quedar aproximadamente.  Además, arrastra al escenario una instancia del componente Button.

5. Al botón cámbiale su propiedad label por Aceptar. Asígnale el nombre de instancia aceptar_btn.

6. A cada uno de los combos ponles los siguientes nombres de instancia (empezando por el combo que se encuentre más arriba y terminando por el que esté más abajo):

En este ejemplo llenaremos cada uno de los combos por medio de ActionScript, por lo que no será necesario modificar las propiedades de estos combos que se encuentran en el panel Parámetros. Aún así, explicaremos qué es cada una de estas opciones:

7. Acomoda tus componentes y agrega los textos necesarios para que tu documento quede similar a la siguiente imagen:

8. De la imagen anterior puedes darte una idea de qué haremos con cada combo.  En el primer combo mostraremos las opciones como las fuimos metiendo al arreglo. En el segundo combo las opciones aparecerán en orden alfabético de acuerdo a su propiedad etiqueta (label). En el tercer combo mostraremos las opciones en orden numérico de acuerdo al valor (value) de las opciones. Para este ejemplo, en las propiedades value de las opciones usamos números (simulando que fueran los IDs de los países en nuestra base de datos); sin embargo, podemos usar textos como valores. En el cuarto combo mostraremos los países ordenados alfabéticamente y habilitaremos el combo de Estado / Provincia cuando el usuario seleccione como país a México o Perú. Dicho lo anterior y una vez que tengas tu archivo de Flash igual a la imagen de arriba es momento de entrar en terreno pantanoso. Crea una nueva capa y ponle de nombre Acciones. A continuación explicaré el código paso a paso.

9. Primero vamos a crear cuatro arreglos donde almacenaremos las opciones de los combos de países y el combo de estado / provincia. Coloca el siguiente código en la capa de Acciones.

Actionscript:
  1. var paises:Array = new Array();
  2. var paisesLabel:Array = new Array();
  3. var paisesValue:Array = new Array();
  4. var estados:Array = new Array();

10. Al inicio, el combo de Estado / Provincia deberá estar desactivado, por lo que debemos poner la siguiente línea de código:

Actionscript:
  1. cbo_estados.enabled = false;

11. El siguiente código muestra la función almacenaPaises, la cual se encargará de almacenar las etiquetas y los valores en un arreglo. A pesar de que en nuestro ejemplo se almacenan los datos de forma estática, hacerlo dinámicamente (extrayendo la información de una base de datos, ya sea por medio de un XML, usando AMFPHP, LoadVars, etc.) es muy fácil ya que bastará recorrer la información obtenida por medio de un ciclo for y añadirla al arreglo.

Actionscript:
  1. function almacenaPaises() {
  2.     paises.push({label:"-- Selecciona --",  data:0});
  3.     paises.push({label:"México",       data:15});
  4.     paises.push({label:"Argentina",         data:12});
  5.     paises.push({label:"España",       data:24});
  6.     paises.push({label:"Venezuela",         data:5});
  7.     paises.push({label:"Colombia",      data:18});
  8.     paises.push({label:"Perú",           data:10});
  9.     paises.push({label:"Chile",           data:28});
  10.    
  11.     for(var i = 0; i <paises.length; i++) {
  12.         paisesLabel.push({label:paises[i].label, data:paises[i].data});
  13.         paisesValue.push({label:paises[i].label + " -- " + paises[i].data, data:paises[i].data});
  14.     }
  15.     paisesLabel.sortOn(["label", "data"]);
  16.     paisesValue.sortOn("data", Array.NUMERIC);
  17.    
  18.     cbo_paises0.dataProvider = paises;
  19.     cbo_paises1.dataProvider = paisesLabel;
  20.     cbo_paises.dataProvider  = paisesLabel;
  21.     cbo_paises2.dataProvider = paisesValue;
  22. }

Nota Analizando el código anterior te darás cuenta de que hicimos la inserción de los campos  para cada arreglo y NO se crearon los arreglos paisesLabel y paisesValue a partir del arreglo paises (es decir, de la forma paisesValue = paises y paisesLabel = paises). Esto se debe a que al hacer la asignación de la forma arregloA = arregloB el arregloB hace referencia a la localidad de memoria del arregloA, por lo tanto al modificar cualquiera de los dos arreglos (agregar/quitar/ordenar elementos, por ejemplo) estaríamos modificando la referencia de ambos (que es la misma) y claro que se estarían afectando los dos.

El método sortOn de un arreglo nos permite ordenarlo de acuerdo al criterio que señalemos. El primer parámetro de este método es el campo sobre el cual queremos ordenarlo (en nuestro caso es label o data). Para el caso del arreglo paisesLabel, estamos ordenando el arreglo primero por etiqueta (label) y después por su valor (data). En el caso del arreglo paisesValue, estamos ordenándolo por el valor de los registros (data). Como el valor de data es solamente numérico, debemos espercificarlo como segundo parámetro del método; ya que si no lo haces el programa primero mostrará los de valor 10 y después los de 5, por ejemplo.

Después de llenar los arreglos y ordenarlos conforme a nuestras necesidades, se los asignamos a los combos cbo_paises0, cbo_paises1, cbo_paises2 y cbo_paises por medio de la propiedad dataProvider.

12. Para poder anidar los combos de paises y Estado / Provincia debemos añadirle un listener al combo de paises. De esta forma, podremos detectar los eventos que se generan en un ComboBox. El evento que debemos detectar es el de change, el cual se produce cuando se cambia el valor del combobox cuando el usuario escoge una opción. El siguiente código añade el listener al combo cuyo nombre de instancia es cbo_paises (penúltimo combo).

Actionscript:
  1. cbo_paises.addEventListener("change", eventoComboBox);
  2. function eventoComboBox(evento) {
  3.     if(evento.target.selectedItem.data == 15 ||evento.target.selectedItem.data == 10)
  4.         almacenaEstados(evento.target.selectedItem.data);
  5.     else
  6.         cbo_estados.enabled = false;
  7. }

Observando el código encontrarás que la función eventoComboBox es llamada cuando se genera el evento; y que esta función recibe como parámetro la variable evento. De esta variable podemos conocer el objeto que lanzó el evento, por medio de la propiedad target (evento.target). Debido a que el target es el combobox cbo_paises podemos hacer uso de la propiedad selectedItem.data para conocer el valor de la opción seleccionada (toma nota de que también podrías usar selectedItem.label para conocer la etiqueta de la opción elegida). Debido a que necesitamos habilitar y llenar el combo de Estado / Provincia cuando el país elegido sea México o Perú, debemos verificar si el valor regresado por selectedItem.data es 15 (valor para México) ó 10 (valor para Perú). En caso de que se cumpla esta condición, llamaremos a la función almacenaEstados, que recibe como parámetro el valor del país elegido. El código de esta función es el siguiente:

Actionscript:
  1. function almacenaEstados(opc) {
  2.     estados = new Array({label:"-- Selecciona --", data:0});
  3.     if(opc == 15) {  
  4.         estados.push({label:"Aguascalientes",   data:"AGS"});
  5.         estados.push({label:"Nuevo León",   data:"NL"});
  6.         estados.push({label:"Yucatán",             data:"YUC"});
  7.         estados.push({label:"Jalisco",    data:"JAL"});
  8.         estados.push({label:"San Luis Potosí",     data:"SLP"});
  9.         estados.push({label:"Oaxaca",       data:"Oaxaca"});
  10.     }
  11.     else {
  12.         estados.push({label:"Huaraz",       data:"HUA"});
  13.         estados.push({label:"Casma",          data:"CAS"});
  14.         estados.push({label:"Ocros",          data:"OCR"});
  15.         estados.push({label:"Arequipa",         data:"ARE"});
  16.         estados.push({label:"Lucanas",    data:"LUC"});
  17.         estados.push({label:"Moho",             data:"MOH"});
  18.     }
  19.     cbo_estados.dataProvider = estados.sortOn(["label"]);
  20.     cbo_estados.addEventListener("load", estadosCargados);
  21.     cbo_estados.enabled = true;
  22. }

La primera línea de la función anterior es importante ya que estamos volviendo a llenar el arreglo estados; si no lo hiciéramos la segunda vez que entráramos a esta función  estaríamos añadiendo los datos al arreglo y por lo tanto aparecerían duplicados (si volvimos a seleccionar el mismo país) o bien revueltos los estados de México con las provincias de Perú.
Cuando la opción (variable opc) es igual a 15 (México), llenamos el combo con los estados de México; en caso contrario, llenamos el combo con las provincias de Perú. Vuelvo a señalar que dentro de esta función podríamos hacer una llamada a la base de datos para obtener los registros o bien la lectura de un XML.
Finalmente, después de llenar el arreglo se lo asignamos al combo cbo_estados. Además, le asignamos un listener del evento load (carga) para detectar cuando se terminen de cargar las opciones del ComboBox y así poner como seleccionado la primera opción del combo (cbo_estados.selectedIndex de la función estadosCargados). Posteriormente agregamos el código para habilitar el combo de estados (cbo_estados.enabled = true;).

Actionscript:
  1. function estadosCargados() {
  2.     cbo_estados.selectedIndex = 0;
  3. }

El último código que falta por pegar es el del botón de Aceptar. Al hacer click en este botón verificamos que el usuario haya seleccionado algún país (del combo cbo_paises, o sea el penúltimo combo) y si no seleccionó alguno mostramos un mensaje de alerta. Si el usuario seleccionó los países de México o Perú, verificamos que haya seleccionado algún estado o provincia y si no fue así mostramos otro mensaje de alerta.

Actionscript:
  1. aceptar_btn.onRelease = function() {
  2.     if(cbo_paises.selectedIndex == 0)
  3.         Alert.show("Por favor selecciona un país", "Aviso");
  4.     else if(cbo_paises.selectedItem.data == 15 || cbo_paises.selectedItem.data == 10) {
  5.         if(cbo_estados.selectedIndex == 0)
  6.             Alert.show("Por favor selecciona un estado", "Aviso");
  7.     }
  8. }

No olvides agregar la llamada a la función almacenaPaises para que se llenen los combos cuando se ejecute la película

Actionscript:
  1. almacenaPaises();

¿Mucho rollo y ya te perdiste? No te preocupes, aquí va el código completo:

Actionscript:
  1. import mx.controls.Alert;
  2.  
  3. var paises:Array = new Array();
  4. var paisesLabel:Array = new Array();
  5. var paisesValue:Array = new Array();
  6. var estados:Array = new Array();
  7.  
  8. cbo_estados.enabled = false;
  9.  
  10. almacenaPaises();
  11.  
  12. cbo_paises.addEventListener("change", eventoComboBox);
  13. function eventoComboBox(evento) {
  14.     if(evento.target.selectedItem.data == 15 ||evento.target.selectedItem.data == 10)
  15.         almacenaEstados(evento.target.selectedItem.data);
  16.     else
  17.         cbo_estados.enabled = false;
  18. }
  19.  
  20. function almacenaPaises() {
  21.     paises.push({label:"-- Selecciona --",  data:0});
  22.     paises.push({label:"México",       data:15});
  23.     paises.push({label:"Argentina",         data:12});
  24.     paises.push({label:"España",       data:24});
  25.     paises.push({label:"Venezuela",         data:5});
  26.     paises.push({label:"Colombia",      data:18});
  27.     paises.push({label:"Perú",           data:10});
  28.     paises.push({label:"Chile",           data:28});
  29.    
  30.     for(var i = 0; i <paises.length; i++) {
  31.         paisesLabel.push({label:paises[i].label, data:paises[i].data});
  32.         paisesValue.push({label:paises[i].label + " -- " + paises[i].data, data:paises[i].data});
  33.     }
  34.     paisesLabel.sortOn(["label", "data"]);
  35.     paisesValue.sortOn("data", Array.NUMERIC);
  36.    
  37.     cbo_paises0.dataProvider = paises;
  38.     cbo_paises1.dataProvider = paisesLabel;
  39.     cbo_paises.dataProvider  = paisesLabel;
  40.     cbo_paises2.dataProvider = paisesValue;
  41. }
  42. function almacenaEstados(opc) {
  43.     estados = new Array({label:"-- Selecciona --", data:0});
  44.     if(opc == 15) {  
  45.         estados.push({label:"Aguascalientes",   data:"AGS"});
  46.         estados.push({label:"Nuevo León",   data:"NL"});
  47.         estados.push({label:"Yucatán",             data:"YUC"});
  48.         estados.push({label:"Jalisco",    data:"JAL"});
  49.         estados.push({label:"San Luis Potosí",     data:"SLP"});
  50.         estados.push({label:"Oaxaca",       data:"OAX"});
  51.     }
  52.     else {
  53.         estados.push({label:"Huaraz",       data:"HUA"});
  54.         estados.push({label:"Casma",          data:"CAS"});
  55.         estados.push({label:"Ocros",          data:"OCR"});
  56.         estados.push({label:"Arequipa",         data:"ARE"});
  57.         estados.push({label:"Lucanas",    data:"LUC"});
  58.         estados.push({label:"Moho",             data:"MOH"});
  59.     }
  60.     cbo_estados.dataProvider = estados.sortOn(["label"]);
  61.     cbo_estados.addEventListener("load", estadosCargados);
  62.     cbo_estados.enabled = true;
  63. }
  64.  
  65. function estadosCargados() {
  66.     cbo_estados.selectedIndex = 0;
  67. }
  68.  
  69. aceptar_btn.onRelease = function() {
  70.     if(cbo_paises.selectedIndex == 0)
  71.         Alert.show("Por favor selecciona un país", "Aviso");
  72.     else if(cbo_paises.selectedItem.data == 15 || cbo_paises.selectedItem.data == 10) {
  73.         if(cbo_estados.selectedIndex == 0)
  74.             Alert.show("Por favor selecciona un estado", "Aviso");
  75.     }
  76. }

Nota Para ordenar los elementos de un ComboBox se pueden usar las funciones sortItems y sortItemsBy. Para este caso deberás tener, de todas formas, arreglos distintos para cada ComboBox.

Hemos llegado al final de este tutorial. Después de tanta explicación no olvides bajar los archivos y ver el archivo de ejemplo que está a continuación.


Este archivo requiere Flash Player 8
Descargar Archivo
Tags: , ,

Si te gustó esta entrada anímate a escribir un comentario o suscribirte al feed y obtener los artículos futuros en tu lector de feeds.

Comentarios

 

 

Hola Aldo,

Es fácil, imagina que este es tu xml (opciones.xml):

XML:
  1. <?xml version="1.0"?>
  2. <opciones>
  3.     <item nombre="Opción 1" id="1" url="pagina1.html" />
  4.     <item nombre="Opción 2" id="2" url="pagina2.html" />
  5.     <item nombre="Opción 3" id="3" url="pagina3.html" />
  6. </opciones>

Ahora imagina que tu combobox se llama opcion_cb. El código sería:

Actionscript:
  1. var opciones:Array = new Array();
  2. var xmlFile:XML = new XML();
  3. xmlFile.ignoreWhite = true;
  4. xmlFile.onLoad = function(success)
  5. {
  6.     if(success)
  7.     {
  8.         var opcionNodo = this.firstChild.firstChild;
  9.  
  10.         while(opcionNodo)
  11.         {
  12.             if(opcionNodo.nodeType == 1)
  13.             {            
  14.                 opciones.push({label:opcionNodo.attributes.nombre, data:opcionNodo.attributes.id, url:opcionNodo.attributes.url});
  15.             }
  16.             opcionNodo = opcionNodo.nextSibling;
  17.         }
  18.         opcion_cb.dataProvider = opciones;
  19.     }
  20.     else
  21.     {
  22.         trace("Error al leer el archivo XML");
  23.     }
  24. }
  25. opcion_cb.addEventListener("change", infoOpcion);
  26. function infoOpcion()
  27. {
  28.     trace("Nombre: " + opcion_cb.selectedItem.label);
  29.     trace("data: " + opcion_cb.selectedItem.data);
  30.     trace("URL: " + opcion_cb.selectedItem.url);
  31. }
  32. xmlFile.load("opciones.xml");

Saludos.

hi

muy bueno tu tutorial carla...mi pregunata es como podrias hacer si los datos los trajiera de un xml?? me podras ayudar con eso d antemano gracias!!

Hola Francisco,

Para hacer lo que necesitas debes usar el listener "change" en ambos combos (no sólo en el primer combo, que es como se muestra en el ejemplo de esta entrada). Al agregar el evento change al primer combo podremos cambiar las opciones del segundo; y al agregar el evento change al segundo combo podremos abrir la página o documento seleccionado.

Te dejo un ejemplo en esta página. Espero te sirva, ya me contarás...

Saludos.

Hola Carla, es muy interesante tu pagina y a la vez una escuela de aprendisaje. gracias por crear algo asi que te explica paso a paso lo que se debe hacer.
Disculpame mi atrevimiento, pero ya que estas en esto, Crees poder hacer que al seleccionar de un combo box, aparezca otra o un list box donde esten elementos que se filtran segun lo seleccionado en la primera y de este list box poder hacer click en uno de los elementos y que se abra un archivo?... no sera mucha molestia pedirte como se hace eso, solo quiero que al seleccionar en el segundo box, se pueda abrir un archivo como un pdf por ejemplo...
Gracias desde ya tu gentil asistencia en esta clase de Flash.
Saludos y mucha Suerte en tus proyectos

Estimado Manolo,

Muchas gracias por escribir.
Espero, en verdad, que estos tutoriales le sean de gran ayuda. Recuerde que nunca es tarde para aprender.

Saludos.

Carla Macías

Soy un novato de 74 años que le ha dado por aprender esto.
Voy a probar tu tutorial. Estoy muy agradecido a personas que como tú hacen esfuerzos para enseñar. Garcias
Manolo
Torrevieja España

[...] en el formulario algunos de los componentes que ya vimos en los post pasados. Estos componentes son ComboBox, RadioButton y [...]

Escribe un comentario

Nota: Es posible que tu comentario requiera autorización, si es así tu comentario será publicado a la brevedad. Gracias.

(requerido)

(requerido)