Componente ComboBox
En 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):
- cbo_paises0
- cbo_paises1
- cbo_paises2
- cbo_paises
- cbo_estados
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:
- data: Son los valores que queremos que tome cada uno de los elementos de un combobox. Estos valores son almacenados en un arreglo. Un ejemplo claro podría ser cuando tienes una tabla países en tu base de datos. Por lo general esta tabla está formada por el nombre del país y un ID que hace referencia a su registro en la base datos. El ID de cada uno de estos registros lo podríamos poner en esta opción de data para que así podamos saber rápidamente el ID del país que el usuario seleccionó.
- editable: Si el valor de esta propiedad es true, entonces el usuario podrá escribir en él. En caso contrario si la propiedad tienen el valor de false, el combobox no será editable. Un combobox editable puede permitirle al usuario introducir un valor que no se encuentra dentro de la lista de opciones.
- labels: Se almacaenan en un arreglo y son las opciones que queremos que aparezca en el combobox. Siguiendo con nuestro ejemplo de los países y IDs, aquí irían cada uno de los nombres de los países.
- rowCount: Su valor es un número indicando la cantidad de renglones que queremos que se muestren de largo. Por ejemplo, si tenemos 8 opciones en el combo y en rowCount tenemos 6, entonces al abrir el combo se mostrarán los primeros seis y un scrollbar para ver los dos que faltan.
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.
-
var paises:Array = new Array();
-
var paisesLabel:Array = new Array();
-
var paisesValue:Array = new Array();
-
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:
-
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.
-
function almacenaPaises() {
-
paises.push({label:"-- Selecciona --", data:0});
-
paises.push({label:"México", data:15});
-
paises.push({label:"Argentina", data:12});
-
paises.push({label:"España", data:24});
-
paises.push({label:"Venezuela", data:5});
-
paises.push({label:"Colombia", data:18});
-
paises.push({label:"Perú", data:10});
-
paises.push({label:"Chile", data:28});
-
-
for(var i = 0; i <paises.length; i++) {
-
paisesLabel.push({label:paises[i].label, data:paises[i].data});
-
paisesValue.push({label:paises[i].label + " -- " + paises[i].data, data:paises[i].data});
-
}
-
paisesLabel.sortOn(["label", "data"]);
-
paisesValue.sortOn("data", Array.NUMERIC);
-
-
cbo_paises0.dataProvider = paises;
-
cbo_paises1.dataProvider = paisesLabel;
-
cbo_paises.dataProvider = paisesLabel;
-
cbo_paises2.dataProvider = paisesValue;
-
}
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).
-
cbo_paises.addEventListener("change", eventoComboBox);
-
function eventoComboBox(evento) {
-
if(evento.target.selectedItem.data == 15 ||evento.target.selectedItem.data == 10)
-
almacenaEstados(evento.target.selectedItem.data);
-
else
-
cbo_estados.enabled = false;
-
}
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:
-
function almacenaEstados(opc) {
-
estados = new Array({label:"-- Selecciona --", data:0});
-
if(opc == 15) {
-
estados.push({label:"Aguascalientes", data:"AGS"});
-
estados.push({label:"Nuevo León", data:"NL"});
-
estados.push({label:"Yucatán", data:"YUC"});
-
estados.push({label:"Jalisco", data:"JAL"});
-
estados.push({label:"San Luis Potosí", data:"SLP"});
-
estados.push({label:"Oaxaca", data:"Oaxaca"});
-
}
-
else {
-
estados.push({label:"Huaraz", data:"HUA"});
-
estados.push({label:"Casma", data:"CAS"});
-
estados.push({label:"Ocros", data:"OCR"});
-
estados.push({label:"Arequipa", data:"ARE"});
-
estados.push({label:"Lucanas", data:"LUC"});
-
estados.push({label:"Moho", data:"MOH"});
-
}
-
cbo_estados.dataProvider = estados.sortOn(["label"]);
-
cbo_estados.addEventListener("load", estadosCargados);
-
cbo_estados.enabled = true;
-
}
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
.
-
function estadosCargados() {
-
cbo_estados.selectedIndex = 0;
-
}
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.
-
aceptar_btn.onRelease = function() {
-
if(cbo_paises.selectedIndex == 0)
-
Alert.show("Por favor selecciona un país", "Aviso");
-
else if(cbo_paises.selectedItem.data == 15 || cbo_paises.selectedItem.data == 10) {
-
if(cbo_estados.selectedIndex == 0)
-
Alert.show("Por favor selecciona un estado", "Aviso");
-
}
-
}
No olvides agregar la llamada a la función almacenaPaises para que se llenen los combos cuando se ejecute la película
-
almacenaPaises();
¿Mucho rollo y ya te perdiste? No te preocupes, aquí va el código completo:
-
import mx.controls.Alert;
-
-
var paises:Array = new Array();
-
var paisesLabel:Array = new Array();
-
var paisesValue:Array = new Array();
-
var estados:Array = new Array();
-
-
cbo_estados.enabled = false;
-
-
almacenaPaises();
-
-
cbo_paises.addEventListener("change", eventoComboBox);
-
function eventoComboBox(evento) {
-
if(evento.target.selectedItem.data == 15 ||evento.target.selectedItem.data == 10)
-
almacenaEstados(evento.target.selectedItem.data);
-
else
-
cbo_estados.enabled = false;
-
}
-
-
function almacenaPaises() {
-
paises.push({label:"-- Selecciona --", data:0});
-
paises.push({label:"México", data:15});
-
paises.push({label:"Argentina", data:12});
-
paises.push({label:"España", data:24});
-
paises.push({label:"Venezuela", data:5});
-
paises.push({label:"Colombia", data:18});
-
paises.push({label:"Perú", data:10});
-
paises.push({label:"Chile", data:28});
-
-
for(var i = 0; i <paises.length; i++) {
-
paisesLabel.push({label:paises[i].label, data:paises[i].data});
-
paisesValue.push({label:paises[i].label + " -- " + paises[i].data, data:paises[i].data});
-
}
-
paisesLabel.sortOn(["label", "data"]);
-
paisesValue.sortOn("data", Array.NUMERIC);
-
-
cbo_paises0.dataProvider = paises;
-
cbo_paises1.dataProvider = paisesLabel;
-
cbo_paises.dataProvider = paisesLabel;
-
cbo_paises2.dataProvider = paisesValue;
-
}
-
function almacenaEstados(opc) {
-
estados = new Array({label:"-- Selecciona --", data:0});
-
if(opc == 15) {
-
estados.push({label:"Aguascalientes", data:"AGS"});
-
estados.push({label:"Nuevo León", data:"NL"});
-
estados.push({label:"Yucatán", data:"YUC"});
-
estados.push({label:"Jalisco", data:"JAL"});
-
estados.push({label:"San Luis Potosí", data:"SLP"});
-
estados.push({label:"Oaxaca", data:"OAX"});
-
}
-
else {
-
estados.push({label:"Huaraz", data:"HUA"});
-
estados.push({label:"Casma", data:"CAS"});
-
estados.push({label:"Ocros", data:"OCR"});
-
estados.push({label:"Arequipa", data:"ARE"});
-
estados.push({label:"Lucanas", data:"LUC"});
-
estados.push({label:"Moho", data:"MOH"});
-
}
-
cbo_estados.dataProvider = estados.sortOn(["label"]);
-
cbo_estados.addEventListener("load", estadosCargados);
-
cbo_estados.enabled = true;
-
}
-
-
function estadosCargados() {
-
cbo_estados.selectedIndex = 0;
-
}
-
-
aceptar_btn.onRelease = function() {
-
if(cbo_paises.selectedIndex == 0)
-
Alert.show("Por favor selecciona un país", "Aviso");
-
else if(cbo_paises.selectedItem.data == 15 || cbo_paises.selectedItem.data == 10) {
-
if(cbo_estados.selectedIndex == 0)
-
Alert.show("Por favor selecciona un estado", "Aviso");
-
}
-
}
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.
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
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
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
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
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.
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 Aldo,
Es fácil, imagina que este es tu xml (opciones.xml):
-
<?xml version="1.0"?>
-
<opciones>
-
<item nombre="Opción 1" id="1" url="pagina1.html" />
-
<item nombre="Opción 2" id="2" url="pagina2.html" />
-
<item nombre="Opción 3" id="3" url="pagina3.html" />
-
</opciones>
Ahora imagina que tu combobox se llama opcion_cb. El código sería:
-
var opciones:Array = new Array();
-
var xmlFile:XML = new XML();
-
xmlFile.ignoreWhite = true;
-
xmlFile.onLoad = function(success)
-
{
-
if(success)
-
{
-
var opcionNodo = this.firstChild.firstChild;
-
-
while(opcionNodo)
-
{
-
if(opcionNodo.nodeType == 1)
-
{
-
opciones.push({label:opcionNodo.attributes.nombre, data
pcionNodo.attributes.id, url
pcionNodo.attributes.url}); -
}
-
opcionNodo = opcionNodo.nextSibling;
-
}
-
opcion_cb.dataProvider = opciones;
-
}
-
else
-
{
-
trace("Error al leer el archivo XML");
-
}
-
}
-
opcion_cb.addEventListener("change", infoOpcion);
-
function infoOpcion()
-
{
-
trace("Nombre: " + opcion_cb.selectedItem.label);
-
trace("data: " + opcion_cb.selectedItem.data);
-
trace("URL: " + opcion_cb.selectedItem.url);
-
}
-
xmlFile.load("opciones.xml");
Saludos.
Disculpa la molestia pero, si quisiera enviar un formulario como el que hiciste por medio de un mail? se puede?
que tal, oye necesito hacer un combox para un diccionario como le hago para que funcione con frames?
gracias
Hola Carla,
Este tuto es impresionante. Te felicito por el trabajo impecable y te agradezco mucho que compartas tus conocimientos.
He probado a pasarle valores al combo desde el XML. Como no he sido capaz de realizar tu propuesta, le he hecho unos cambios que me resultan más fáciles:
var opciones:Array = new Array();
var xmlFile:XML = new XML();
xmlFile.ignoreWhite = true;
xmlFile.onLoad = function(success)
{
if(success)
{
var opcionNodo = this.firstChild.firstChild;
for(i=0; i<nodes.length; i++)
{ opciones.push({label:opcionNodo.attributes.nombre});
}
opcion_cb.dataProvider = opciones;
}
else
{
trace("Error al leer el archivo XML");
}
}
Lo malo es que el XML repite valores para el mismo atributo, con lo que se refleja en el combo. ¿Cómo podría hacer para que el combo muestre sólo valores únicos?
Un saludo maja!
Hola Bodomias,
Gracias por tu comentario.
¿Podrías poner tu código completo y el XML que estás llamando?
Creo que el código que pegaste está incompleto ya que no veo de dónde sale la variable nodes.
Saludos.
Hola Carla,
Tienes razón, aunque el código es un churro bastante largo.
También tengo una duda básica, y es que no sé cómo recoger el dato del ítem seleccionado del combobox en la función filterFunc. Lo he conseguido con un textInput (cajaNombre) pero el combobox se me resiste.
Aquí va el código.
-
var miXML:XML = new XML();
-
var datosProcesos:Array = new Array();
-
var ComboTipo: Array = new Array();
-
var ComboMunicipio: Array = new Array();
-
var ComboCategoria: Array = new Array();
-
var ComboArquitectura: Array = new Array();
-
var alClicar:Object = new Object();
-
-
//Cargamos el XML
-
miXML.ignoreWhite = true;
-
miXML.onLoad = function(success){
-
//Cargamos y llenamos el array
-
if (success){
-
var nodes:Array = miXML.firstChild.childNodes;
-
-
//Carga de Combobox
-
for (i=0; i<nodes.length; i++) {
-
ComboMunicipio.push({label:nodes[i].attributes.Municipio})
-
}
-
for (i=0; i<nodes.length; i++) {
-
ComboTipo.push({label:nodes[i].attributes.Tipo})
-
}
-
for (i=0; i<nodes.length; i++) {
-
ComboCategoria.push({label:nodes[i].attributes.Categoria})
-
}
-
for (i=0; i<nodes.length; i++) {
-
ComboArquitectura.push({label:nodes[i].attributes.Arquitectura})
-
}
-
cbMunicipio.dataProvider = ComboMunicipio;
-
cbTipo.dataProvider = ComboTipo;
-
cbCategoria.dataProvider = ComboCategoria;
-
cbArquitectura.dataProvider = ComboArquitectura;
-
-
-
-
//Asignamos al DataSet y al DataGrid
-
datos.items = datosProcesos;
-
datos.filtered = false;
-
procesos_grid.dataProvider = datos.dataProvider;
-
-
//Propiedades del DataGrid
-
procesos_grid.resizableColumns = false;
-
procesos_grid.getColumnAt(0).width = 100;
-
procesos_grid.getColumnAt(1).width = 70;
-
procesos_grid.getColumnAt(2).width = 100;
-
procesos_grid.getColumnAt(3).width = 150;
-
procesos_grid.getColumnAt(0).setStyle("textAlign", "left");
-
procesos_grid.getColumnAt(1).setStyle("textAlign", "right");
-
procesos_grid.getColumnAt(2).setStyle("textAlign", "right");
-
procesos_grid.getColumnAt(3).setStyle("textAlign", "right");
-
-
//Deshabilitamos ordenación de las columnas, pero no las columnas
-
for (i=0; i<nodes.length; i++){
-
procesos_grid.getColumnAt(i).sortOnHeaderRelease = false;
-
}
-
}
-
else {
-
trace("No se han cargado correctarmente los datos");
-
}
-
}
-
miXML.load("data2.xml");
-
-
// FILTRAMOS
-
alClicar.click = function(){
-
-
-
//Si no hay filtro lo ponemos y cambiamos el texto en el botón
-
if (datos.filtered == false){
-
datos.filtered = true;
-
btBuscar.label = 'Borrar';
-
}
-
//Si hay filtro lo quitamos y cambiamos el texto en el botón e inicializamos las cajas.
-
else if (datos.filtered == true){
-
datos.filtered = false;
-
datos.filterFunc();
-
btBuscar.label = 'Buscar';
-
ctNombre.text='';
-
cbMunicipio.selectedIndex=0;
-
cbCategoria.selectedIndex=0;
-
cbTipo.selectedIndex=0;
-
cbArquitectura.selectedIndex=0;
-
-
}
-
-
//Función filterFunc de Flash
-
datos.filterFunc = function(registro:Object) {
-
-
-
//Caja del Nombre
-
var strNombre:String=String(registro.nombres)
-
strNombre = strNombre.toLowerCase()
-
var strCajaNombre:String=String(ctNombre.text)
-
strCajaNombre = strCajaNombre.toLowerCase()
-
return(strNombre.indexOf(strCajaNombre) != -1); // No borrar
-
-
//Combos
-
// AQUÍ TENGO LA DUDA
-
-
-
}
-
}
-
btBuscar.addEventListener("click", alClicar);
**********************
Aquí el XML:
***************************
gracias por el interés que muestras, por todo...
Un saludo
Hola Bodomias,
Prueba pegando el código entre [ xml] y [ /xml], quitando el espacio que está entre el corchete que abre y la x, y entre el corchete que abre y la diagonal.
Saludos.
Hola Carla, he cambiado los "<" por "[" y he hecho lo que tú dices, a ver si me lo pega. Gracias por la idea.
De todas formas, ya he encontrado la forma de solucionarlo. Ahora me he encontrado con otro tipo de problemas al combinar los combos. Lo último que me ha sucedido es que el dataGrid no me carga los datos (misterioso) y el código está igual que antes. Si es que lo mío es el diseño gráfico y esto me pasa por meterme a programar, aunque no lo estoy haciendo demasiado mal.
Bueno, eso, que me estoy enrollando, aquí te dejo el XML.
De nuevo gracias y saludos
[data]
[item nombre="nombre1" persona="persona contacto1" direccion="direccion1" localidad="localidad1" cp="32001" web="www.web.com" mail="mail@web.com" telefono="912 345 678" movil="654 321 000" fax="912 345 678" coor="???" tipo="Hotel" aforo="100" servicios="parking, piscina, spa, wifi" equipamiento="cañón, atril, audiovisuales" descripcion="descripcion1" categoria="3 estrellas" arquitectura="tradicional" image1="http://www.innotur.org/intranet/images/img_Negocio/Imagen1_22.jpg" image2="http://www.innotur.org/intranet/images/img_Negocio/Imagen2_22.jpg" /]
<item nombre="nombre2" persona="persona contacto2" direccion="direccion2" localidad="localidad2" cp="32002" web="www.web2.com" mail="mail@web2.com" telefono="987 654 321" movil="678 912 345" fax="987 654 321" coor="???" tipo="Salon" aforo="300" servicios="parking, piscina, spa, wifi" equipamiento="cañón, atril, audiovisuales" descripcion="descripcion2" categoria="2 estrellas" arquitectura="moderna" image1="http://www.innotur.org/intranet/images/img_Negocio/Imagen1_22.jpg" image2="http://www.innotur.org/intranet/images/img_Negocio/Imagen2_22.jpg" /]
[data]
Hola Bodomias,
Te escribo varios comentarios:
- En el XML tienes los nombres de las propiedades con minúsculas (categoria, descripcion, arquitectura, etc.). Sin embargo, en el Flash lo tienes con mayúsculas (ComboCategoria.push({label:nodes[i].attributes.Categoria}), ComboArquitectura.push({label:nodes[i].attributes.Arquitectura})). Habría que cambiarlo en el Flash de tal forma que quede en minúscula.
- En tu XML no está la propiedad municipio, por lo tanto el combo muestra la palabra undefined dos veces.
- No es necesario realizar cuatro veces el mismo ciclo for para llenar los combos; por lo tanto para ahorrar tiempo y recursos tu código puede quedar de la siguiente manera:
-
for (i=0; i<nodes.length; i++) {
-
ComboMunicipio.push({label:nodes[i].attributes.municipio});
-
ComboTipo.push({label:nodes[i].attributes.tipo});
-
ComboCategoria.push({label:nodes[i].attributes.categoria});
-
ComboArquitectura.push({label:nodes[i].attributes.arquitectura});
-
}
- Supongo que en el DataGrid quieres mostrar estos mismos datos de Municipio, Tipo, Categoría y Arquitectura. Si es así puedes aprovechar el ciclo anterior para llenar el arreglo datosProcesos y luego establecerlo como dataProvider del DataGrid.
-
for (i=0; i<nodes.length; i++) {
-
ComboMunicipio.push({label:nodes[i].attributes.municipio});
-
ComboTipo.push({label:nodes[i].attributes.tipo});
-
ComboCategoria.push({label:nodes[i].attributes.categoria});
-
ComboArquitectura.push({label:nodes[i].attributes.arquitectura});
-
datosProcesos.push({municipio:nodes[i].attributes.municipio, tipo:nodes[i].attributes.tipo, categoria:nodes[i].attributes.categoria, arquitectura:nodes[i].attributes.arquitectura});
-
}
Y ya por último le asignas el arreglo al DataGrid:
-
procesos_grid.dataProvider = datosProcesos;
Saludos.
Vaya, muchas gracias Carla.
Es que soy novatillo en esto y la programación me hace aguas por todos lados.
Con tu ayuda he conseguido hacer el buscador como quería, y que me presente los datos de la búsqueda en unas fichas.
El último problema que me asalta es que querría tener el buscador en un fotograma y los resultados del DataGrid en otro... Voy a buscar información. Si sabes cómo hacerlo o dónde buscar te estaría eternamente agradecido. Tendré que utilizar un DataHolder para guardar la búsqueda?
Saludos e infinitas gracias.
Hola, por falta de tiempo para investigar en dataHolders se me ha ocurrido un truco para visualizar los resultados del Grid en otro fotograma:
lo hago invisible en el mismo fotograma del buscador (procesos_grid.visible = false); y lo pongo en 'true' en el evento 'click' del botón 'buscar'.
Saludos
Hola Bodomias,
No entiendo tu pregunta, deberías de poder acceder al arreglo con los resultados de tu búsqueda en el siguiente frame. Ejemplo: en el frame 14 tienes el buscador, el usuario ejecuta la búsqueda por medio de un botón, obtienes los resultados, los almacenas en el arreglo, te pasas al frame 15 y ahí le asignas al datagrid como dataProvider el arreglo que llenaste en el frame 14.
Saludos.
Estoy empezando y hasta esto me resulta complejo. Yo sólo quiero tener una lista desplegable, y con tanta cosa me he perdido. No tendrás un tutorial de como hacer una única lista, ¿verdad?
Gracias
Hola Lucia,
Para crear una lista desplegable fácilmente tienes dos opciones:
1) Arrastrar el componente Combobox al área de trabajo. Seleccionarlo y en el panel Parámetros puedes meter las opciones (data es el arreglo de los valores de cada opción y label es el arreglo del texto que se mostrará en la lista).
2) Arrastrar el componente Combobox, seleccionarlo y ponerle un nombre de instancia en el panel Propiedades (Ej. cbo_paises). Luego, en el panel de acciones dentro del primer frame de tu película pones el siguiente código:
-
almacenaPaises();
-
function almacenaPaises() {
-
paises.push({label:"-- Selecciona --", data:0});
-
paises.push({label:"México", data:15});
-
paises.push({label:"Argentina", data:12});
-
paises.push({label:"España", data:24});
-
paises.push({label:"Venezuela", data:5});
-
paises.push({label:"Colombia", data:18});
-
paises.push({label:"Perú", data:10});
-
paises.push({label:"Chile", data:28});
-
cbo_paises.dataProvider = paises;
-
}
Del código anterior sólo debes modificar los datos que van en label y en data de acuerdo a tus necesidades. Para saber el valor de la opción seleccionada sólo debes usar cbo_paises.selectedItem.data
-
trace("Valor selecciondado: " + cbo_paises.selectedItem.data);
Saludos.
Hola Lucia,
El arreglo o los valores de data puedes utilizarlos, por ejemplo, en bases de datos donde tienes una tabla de países con un ID único. Muchas veces no quieres guardar el nombre tal cual se muestra en el combobox, si no que le quieres dar un valor para que después hagas referencia a él por medio de ese valor.
Vaya, no sé si me estaré explicando bien. Otro ejemplo podría ser una tabla de divisas donde tienes:
Peso Mexicano (MXN)
Euro (EUR)
Dólar (USD)
Dólar Canadiense (CAD)
Tus etiquetas (label) serían 'Peso Mexicano', 'Euro', 'Dólar', 'Dólar Canadiense' y sus valores (data) serían 'MXN', 'EUR', 'USD', 'CAD'. Para hacer referencia al valor de data de la opción seleccionada utilizarías cbo_paises.selectedItem.data
Aún así no es necesario establecer o llenar el arreglo data, si quieres saber el valor de la etiqueta (label) de la opción seleccionada utilizarías cbo_paises.selectedItem.label
Saludos.
Hola mi nombre es henr,su blog es muy bueno, y necesito de su ayuda:
Tengo una tabla parecida a esta, para esto (basado en el tutorial escrito por usted sobre los COMBOBOX) he creado tres combobox, uno para seleccionar los diámetros, otro para los
grados (que son los G-34, G-40 y G-60) y otro combo para los valores de los deltaL.
El problema radica en que a cada diámetro nominal que escojo en el primer combo, en función del grado que escojo en el segundo combo me debe aparecer un valor único para cada
variante.
Por ejemplo:
Si escojo “B” en el pr -40 en el segundo combo, me debe aparecer en el tercer combo el valor “H
Aquí está el código de los tres combos, bueno como le dije basado en su tutorial de los combobox.
import mx.controls.Alert;
var grados:Array = new Array();
var gradosLabel:Array = new Array();
var gradosValue:Array = new Array();
var deltaL:Array = new Array();
cbo_deltaL.enabled = false;
almacenaGrados();
cbo_grados.addEventListener("change",eventoComboBox);
function eventoComboBox(evento) {
if (evento.target.selectedItem.data == "G-34" || evento.target.selectedItem.data == "G-40" || evento.target.selectedItem.data == "G-60") {
almacenaDeltaL(evento.target.selectedItem.data);
} else {
cbo_deltaL.enabled = false;
}
}
function almacenaGrados() {
grados.push({label:"-- Seleccione --", data:0});
grados.push({label:"G-34", data:"G-34"});
grados.push({label:"G-40", data:"G-40"});
grados.push({label:"G-60", data:"G-60"});
for (var i = 0; i<grados.length; i++) {
gradosLabel.push({label:grados[i].label, data:grados[i].data});
gradosValue.push({label:grados[i].label+" -- "+grados[i].data, data:grados[i].data});
}
gradosLabel.sortOn(["label", "data"]);
gradosValue.sortOn("data",Array.NUMERIC);
cbo_grados0.dataProvider = grados;
cbo_grados1.dataProvider = gradosLabel;
cbo_grados.dataProvider = gradosLabel;
cbo_grados2.dataProvider = gradosValue;
}
function almacenaDeltaL(opc) {
deltaL = new Array({label:"-- seleccione --", data:0});
if (opc == "G-34") {
deltaL.push({label:"10.7", data:10.7});
deltaL.push({label:"16.4", data:16.4});
deltaL.push({label:"19.7", data:19.7});
deltaL.push({label:"23.0", data:23.0});
deltaL.push({label:"26.3", data:26.3});
deltaL.push({label:"29.6", data:29.6});
deltaL.push({label:"37.2", data:37.2});
deltaL.push({label:"40.9", data:40.9});
deltaL.push({label:"46.5", data:46.5});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
} else if (opc == "G-40") {
deltaL.push({label:"12.10", data:12.10});
deltaL.push({label:"17.65", data:17.65});
deltaL.push({label:"23.60", data:23.60});
deltaL.push({label:"26.00", data:26.00});
deltaL.push({label:"29.55", data:29.55});
deltaL.push({label:"33.50", data:33.50});
deltaL.push({label:"35.30", data:35.30});
deltaL.push({label:"45.60", data:45.60});
deltaL.push({label:"51.80", data:51.80});
deltaL.push({label:"64.10", data:64.10});
deltaL.push({label:"73.20", data:73.20});
deltaL.push({label:"82.40", data:82.40});
deltaL.push({label:"91.50", data:91.50});
} else {
deltaL.push({label:"---", data:0});
deltaL.push({label:"20.70", data:20.70});
deltaL.push({label:"24.90", data:24.90});
deltaL.push({label:"29.00", data:29.00});
deltaL.push({label:"33.20", data:33.20});
deltaL.push({label:"37.30", data:37.30});
deltaL.push({label:"45.80", data:45.80});
deltaL.push({label:"50.30", data:50.30});
deltaL.push({label:"57.20", data:57.20});
deltaL.push({label:"70.10", data:70.10});
deltaL.push({label:"80.10", data:80.10});
deltaL.push({label:"90.10", data:90.10});
deltaL.push({label:"100.1", data:100.1});
}
cbo_deltaL.dataProvider = deltaL.sortOn(["deltaL"]);
cbo_deltaL.addEventListener("load",deltaLCargados);
cbo_deltaL.enabled = true;
}
function deltaLCargados() {
cbo_deltaL.selectedIndex = 0;
}
aceptar_btn.onRelease = function() {
if (cbo_dnominal.selectedIndex == 0) {
Alert.show("Por favor seleccione un Diámetro Nominal","Aviso");
} else if (cbo_grados.selectedIndex == 0) {
Alert.show("Por favor seleccione un Grado de Acero","Aviso");
} else if (cbo_grados.selectedItem.data == "G-34" || cbo_grados.selectedItem.data == "G-40") {
if (cbo_deltaL.selectedIndex == 0) {
Alert.show("Por favor seleccione un Delta L","Aviso");
}
}
};
Hola henr,
No entendí muy bien tu pregunta, espero poder ayudarte.
En tu comentario hablas de tres combobox (diámetros, grados y deltaL). Sin embargo en tu código veo que tienes cbo_grados, cbo_grados0, cbo_grados1, cbo_grados2, cbo_deltaL y cbo_dnominal (el cual no veo que sea llenado) y no entiendo bien para que son todos ellos.
Además, dices que "a cada diámetro nominal que escojo en el primer combo, en función del grado que escojo en el segundo combo debe aparecer un valor único para cada variente"; dado lo anterior entiendo que los condicionales if deben ser con un AND de dos cosas (Si X como valor del primer combo y Y como valor del segundo combo, entonces Z).
¿Qué valores van en el primer combo (diámetros) y cuál es su nombre?
¿Qué valores van en el segundo combo (grados) y cuál es su nombre?
¿Cuáles son los condificionales para los valores del tercer combo y cómo se llama?
Ejemplo:
Valores del primer combo (cbo_diametros) = {"d1", "d2", "d3"}
Valores del segundo combo (cbo_grados) = {"G-34", "G-40", "G-60"}.
Si d1 y G-34, entonces:
deltaL.push({label:"10.7", data:10.7});
deltaL.push({label:"16.4", data:16.4});
deltaL.push({label:"19.7", data:19.7});
deltaL.push({label:"23.0", data:23.0});
deltaL.push({label:"26.3", data:26.3});
deltaL.push({label:"29.6", data:29.6});
deltaL.push({label:"37.2", data:37.2});
deltaL.push({label:"40.9", data:40.9});
deltaL.push({label:"46.5", data:46.5});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
Si d1 y G-40, entonces:
deltaL.push({label:"---", data:0});
deltaL.push({label:"20.70", data:20.70});
deltaL.push({label:"24.90", data:24.90});
deltaL.push({label:"29.00", data:29.00});
deltaL.push({label:"33.20", data:33.20});
deltaL.push({label:"37.30", data:37.30});
deltaL.push({label:"45.80", data:45.80});
deltaL.push({label:"50.30", data:50.30});
deltaL.push({label:"57.20", data:57.20});
deltaL.push({label:"70.10", data:70.10});
deltaL.push({label:"80.10", data:80.10});
deltaL.push({label:"90.10", data:90.10});
deltaL.push({label:"100.1", data:100.1});
No es necesario que pongas todos los condicionales, nada más es para darme una idea y ver cómo quedaría el código.
Saludos.
Gracias Carla, por responderme y compartir tus conocimientos, no se si te dije ya que no se mucho de programacion pues soy diseñador.....
entonces lo que sucede es que no habia limpiado el codigo completo, tengo documento pdf en donde te pongo una tabla e imagenes de la interface del programa, donde tal vez si me entiendas por completo lo que necesito. si puedes mandarme un correo, ya tienes el mio, espero por tu respuesta, gracias de antemano.
Ok Carla, esto es lo que me pediste:
Los valores del primer combo: (cbo_dnominal)
cbo_dnominal.addItem({label:"-- seleccione --", data:0});
cbo_dnominal.addItem({label:"6.40 mm (1/4 in)", data:6.4});
cbo_dnominal.addItem({label:"9.50 mm (3/8 in)", data:9.5});
cbo_dnominal.addItem({label:"12.70 mm (1/2 in)", data:12.70});
cbo_dnominal.addItem({label:"14 mm", data:14});
cbo_dnominal.addItem({label:"15.9 mm", data:15.9});
cbo_dnominal.addItem({label:"18 mm", data:18});
cbo_dnominal.addItem({label:"19 mm (3/4 in)", data:19});
cbo_dnominal.addItem({label:"22 mm", data:22});
cbo_dnominal.addItem({label:"25.4 mm (1 in)", data:25.4});
cbo_dnominal.addItem({label:"28 mm", data:28});
cbo_dnominal.addItem({label:"32.3 mm (1 1/4 in)", data:32.3});
cbo_dnominal.addItem({label:"35.8 mm", data:35.8});
cbo_dnominal.addItem({label:"40 mm (1 1/2 in)", data:40});
Los valores del segundo combo: (cbo_grados)
grados.push({label:"-- Seleccione --", data:0});
grados.push({label:"G-34", data:"G-34"});
grados.push({label:"G-40", data:"G-40"});
grados.push({label:"G-60", data:"G-60"});
Los valores del tercer combo: (cbo_deltaL)
//PARA CUANDO SE SELECIONA G-34
deltaL.push({label:"10.7", data:10.7});
deltaL.push({label:"16.4", data:16.4});
deltaL.push({label:"19.7", data:19.7});
deltaL.push({label:"23.0", data:23.0});
deltaL.push({label:"26.3", data:26.3});
deltaL.push({label:"29.6", data:29.6});
deltaL.push({label:"37.2", data:37.2});
deltaL.push({label:"40.9", data:40.9});
deltaL.push({label:"46.5", data:46.5});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
deltaL.push({label:"---", data:0});
//PARA CUANDO SE SELECIONA G-40 DE ESTOS VALORES
/*A CADA DIAMETRO QUE SE ESCOGE DEBE SALIR EN EL
TERCER COMBO UN SOLO VALOR. POR EJEMPLO SI SE ESCOGE:
cbo_dnominal.addItem({label:"12.70 mm (1/2 in)", data:12.70}); EN COMBO1
grados.push({label:"G-40", data:"G-40"}); EN COMBO2
DEBE SALIR: deltaL.push({label:"23.60", data:23.60}); EN COMBO3
y no todos los valores.
Valor: 23.60 de DeltaL */
} else if (opc == "G-40") {
deltaL.push({label:"12.10", data:12.10});
deltaL.push({label:"17.65", data:17.65});
deltaL.push({label:"23.60", data:23.60});
deltaL.push({label:"26.00", data:26.00});
deltaL.push({label:"29.55", data:29.55});
deltaL.push({label:"33.50", data:33.50});
deltaL.push({label:"35.30", data:35.30});
deltaL.push({label:"45.60", data:45.60});
deltaL.push({label:"51.80", data:51.80});
deltaL.push({label:"64.10", data:64.10});
deltaL.push({label:"73.20", data:73.20});
deltaL.push({label:"82.40", data:82.40});
deltaL.push({label:"91.50", data:91.50});
//PARA CUANDO SE SELECIONA G-60
} else {
deltaL.push({label:"---", data:0});
deltaL.push({label:"20.70", data:20.70});
deltaL.push({label:"24.90", data:24.90});
deltaL.push({label:"29.00", data:29.00});
deltaL.push({label:"33.20", data:33.20});
deltaL.push({label:"37.30", data:37.30});
deltaL.push({label:"45.80", data:45.80});
deltaL.push({label:"50.30", data:50.30});
deltaL.push({label:"57.20", data:57.20});
deltaL.push({label:"70.10", data:70.10});
deltaL.push({label:"80.10", data:80.10});
deltaL.push({label:"90.10", data:90.10});
deltaL.push({label:"100.1", data:100.1});
}
Hola Henr,
Dos preguntas:
1) Señalas que "
//PARA CUANDO SE SELECIONA G-40 DE ESTOS VALORES
/*A CADA DIAMETRO QUE SE ESCOGE DEBE SALIR EN EL
TERCER COMBO UN SOLO VALOR. POR EJEMPLO SI SE ESCOGE:
cbo_dnominal.addItem({label:"12.70 mm (1/2 in)", data:12.70}); EN COMBO1
grados.push({label:"G-40", data:"G-40"}); EN COMBO2
DEBE SALIR: deltaL.push({label:"23.60", data:23.60}); EN COMBO3
y no todos los valores. */
¿Cada opción dependiendo de qué seleccionaron en cbo_dnominal será distinto o para todos deltaL es de 23.60?
2)¿El segundo else es para G-40 o para G-34? Ya que si fuera para G-40 nunca entraría debido a los condicionales de los que hablamos en el punto 1).
Saludos.
Saludos Carla, a cada valor de diametro nominal, le corresponde un unico valor de deltaL, en funcion del grado de acero escogido, ahora, hay que tomar los valores, no por el label ni por el data sino por como son introducidos en el array. De veras gracias por el empeño en ayudarme.
Hola Henr,
Te dejo parte del código para que veas cómo quedaría, faltaría ajustar bien los condicionales de acuerdo a tus necesidades.
Recuerda que puedes hacer click sobre el rectángulo café que dice Texto Plano y así copiar el código sin la numeración.
Saludos.
-
import mx.controls.Alert;
-
-
var dominal:Array = new Array();
-
var grados:Array = new Array();
-
var deltaL:Array = new Array();
-
cbo_deltaL.enabled = false;
-
-
almacenaDominal();
-
almacenaGrados();
-
-
function almacenaDominal()
-
{
-
dominal.addItem({label:"– seleccione –", data:0});
-
dominal.addItem({label:"6.40 mm (1/4 in)", data:6.4});
-
dominal.addItem({label:"9.50 mm (3/8 in)", data:9.5});
-
dominal.addItem({label:"12.70 mm (1/2 in)", data:12.7});
-
dominal.addItem({label:"14 mm", data:14});
-
dominal.addItem({label:"15.9 mm", data:15.9});
-
dominal.addItem({label:"18 mm", data:18});
-
dominal.addItem({label:"19 mm (3/4 in)", data:19});
-
dominal.addItem({label:"22 mm", data:22});
-
dominal.addItem({label:"25.4 mm (1 in)", data:25.4});
-
dominal.addItem({label:"28 mm", data:28});
-
dominal.addItem({label:"32.3 mm (1 1/4 in)", data:32.3});
-
dominal.addItem({label:"35.8 mm", data:35.8});
-
dominal.addItem({label:"40 mm (1 1/2 in)", data:40});
-
-
cbo_dominal.dataProvider = dominal;
-
}
-
-
function almacenaGrados()
-
{
-
grados.push({label:"– Seleccione –", data:0});
-
grados.push({label:"G-34", data:"G-34"});
-
grados.push({label:"G-40", data:"G-40"});
-
grados.push({label:"G-60", data:"G-60"});
-
-
cbo_grados.dataProvider = grados;
-
}
-
-
/* Observa que ambos combos deben llevar listener, para que podamos saber si se cambio la selección de cualquiera de ellos */
-
cbo_dominal.addEventListener("change", almacenaDelta);
-
cbo_grados.addEventListener("change", almacenaDelta);
-
-
/* Es obligatorio recibir como parámetro el evento generado, sin embargo no lo vamos a utilizar ya que necesitamos saber los valores de ambos combos */
-
function almacenaDelta(evento) {
-
if(cbo_dominal.selectedIndex != 0 && cbo_grados.selectedIndex != 0) /* Revisamos que ninguno de los combos tenga como selección la primera opción (– seleccione –) */
-
{
-
if(cbo_dominal.selectedItem.data == 12.7 && cbo_grados.selectedItem.data == "G-40") {
-
deltaL = new Array();
-
deltaL.push({label:"23.60", data:23.60});
-
cbo_deltaL.dataProvider = deltaL;
-
cbo_deltaL.enabled = true;
-
cbo_deltaL.selectedIndex = 0;
-
}
-
else if(cbo_dominal.selectedItem.data == 12.7 && cbo_grados.selectedItem.data == "G-40") {
-
deltaL = new Array();
-
deltaL.push({label:"13.60", data:13.60}); /* Cambiar este valor, sólo lo puse como ejemplo */
-
cbo_deltaL.dataProvider = deltaL;
-
cbo_deltaL.enabled = true;
-
cbo_deltaL.selectedIndex = 0;
-
}
-
else if(cbo_dominal.selectedItem.data == 12.7 && cbo_grados.selectedItem.data == "G-40") {
-
deltaL = new Array();
-
deltaL.push({label:"30.90", data:30.9}); /* Cambiar este valor, sólo lo puse como ejemplo */
-
cbo_deltaL.dataProvider = deltaL;
-
cbo_deltaL.enabled = true;
-
cbo_deltaL.selectedIndex = 0;
-
}
-
else if (opc == "G-40") {
-
deltaL = new Array();
-
deltaL.push({label:"12.10", data:12.10});
-
deltaL.push({label:"17.65", data:17.65});
-
deltaL.push({label:"23.60", data:23.60});
-
deltaL.push({label:"26.00", data:26.00});
-
deltaL.push({label:"29.55", data:29.55});
-
deltaL.push({label:"33.50", data:33.50});
-
deltaL.push({label:"35.30", data:35.30});
-
deltaL.push({label:"45.60", data:45.60});
-
deltaL.push({label:"51.80", data:51.80});
-
deltaL.push({label:"64.10", data:64.10});
-
deltaL.push({label:"73.20", data:73.20});
-
deltaL.push({label:"82.40", data:82.40});
-
deltaL.push({label:"91.50", data:91.50});
-
cbo_deltaL.dataProvider = deltaL;
-
cbo_deltaL.enabled = true;
-
cbo_deltaL.selectedIndex = 0;
-
//PARA CUANDO SE SELECIONA G-60
-
} else {
-
deltaL = new Array();
-
deltaL.push({label:"—", data:0});
-
deltaL.push({label:"20.70", data:20.70});
-
deltaL.push({label:"24.90", data:24.90});
-
deltaL.push({label:"29.00", data:29.00});
-
deltaL.push({label:"33.20", data:33.20});
-
deltaL.push({label:"37.30", data:37.30});
-
deltaL.push({label:"45.80", data:45.80});
-
deltaL.push({label:"50.30", data:50.30});
-
deltaL.push({label:"57.20", data:57.20});
-
deltaL.push({label:"70.10", data:70.10});
-
deltaL.push({label:"80.10", data:80.10});
-
deltaL.push({label:"90.10", data:90.10});
-
deltaL.push({label:"100.1", data:100.1});
-
cbo_deltaL.dataProvider = deltaL;
-
cbo_deltaL.enabled = true;
-
cbo_deltaL.selectedIndex = 0;
-
}
-
}
-
}
Nota: No sé en dónde entran las comprobaciones para G-34.
Saludos Carlas, hace unos dias le envie por email el pdf cq creo nos ayudara a resolver este problemita..bueno gracias y nos vemos.
Buen dia a todos, los felicito por la excelente pagina que tienen y a los foreros por su educacion y ganas de trabajar, he visitado muchos foros, donde los publicantes se creen dioses y los visitantes pretenden que se les haga todo y hasta se lo envien a su correo, sin embargo visitar esta pagina lo hace a uno sentirse como en familia todos quieren trabajar y todos ayudar, la delicadeza de las explicaciones y la humildad de las preguntas, los felicito a todos y reciban de mi parte un fuerte abrazo, saludos.
p.d. disculpen por no tocar el tema pero las preguntas que tenia se contestaron solitas leyendo, muchas gracias
Hola Luis,
Muchas gracias por tu comentario y me da muchísima alegría que te guste el blog.
Saludos.
Hola, realmente alabo tu labor y cómo ayudas a la gente con sus dudas.
Estoy empezando y mi pregunta es muy simple y quizás algo tonta: Al darle a un botón "Borrar formulario", ¿cómo vuelvo mi combo box a su estado inicial?
Muchas gracias
Hola Lucía,
Gracias por tu comentario.
Suponiendo que el nombre de instancia de tu combobox sea cbo_paises, tendrías que hacer lo siguiente:
-
cbo_paises.selectedIndex = 0;
Saludos.
Hola que buen tutorial, solamente quiero a ver si me pueden ayudar necesito hacer dos combobox cargados con informacion en xml , pero que uno dependa de otro, es decir si yo selecciono por ejemplo del primer combo, un estado que en el segundo me muestre los municipios de ese estado y cuando seleccione el municipio de ese estado en el segundo combo que me muestre los datos generales que tengo en xml , la estructura de los datos del municipio es asi
China NL
10,697
9
Espero que me ayuden Gracias
Saludos Carla, como hago para que cuando abra un swf el cursor me parpadee en un cuadro de texto determinado....ah y por otro lado el setFocus que me enviaste si lo convierto en movie clic no me funciona, tengo kque dejarlo en la linea principal de la pelicula. Sin mas Henry
Hola Kose,
Disculpa la tardanza.
Puedes hacerlo de dos formas:
1. Poniendo como label el nombre de la provincia y en value el URL. Ej.
provincias.push({label:"Provincia 1", data:"pagina1.html"});
provincias.push({label:"Provincia 2", data:"pagina2.html"});
cbo_provincias.dataProvider = provincias;
De esta forma tendrías que cambiar la página de la siguiente manera:
getURL(provincias.selectedItem.value, "_self");
2. Poniendo un label y data distinto al URL y de esta forma tendrías que hacer un if o un switch. Ej.
provincias.push({label:"Provincia 1", data:"P1"});
provincias.push({label:"Provincia 2", data:"P2"});
cbo_provincias.dataProvider = provincias;
De esta forma tendrías que cambiar la página de la siguiente manera:
switch(provincias.selectedItem.value)
{
case "P1": getURL("pagina1.html", "_self"); break;
case "P2": getURL("pagina2.html", "_self"); break;
default: break;
}
Saludos.
Hola Henry,
Al parecer hay un "bug" en Flash al poner el cursor en un campo de texto que está dentro de un MovieClip. Ya me había pasado que, si bien el cursor está en el campo de texto (si escribes el texto te aparecerá en ese campo) el cursor no se muestra ni "parpadea".
Aún así si quieres dejar tus campos de texto dentro de un MovieClip tendrás que cambiar el código que te envié por lo siguiente:
-
var seleccion:String = Selection.getFocus();
-
var nombre:Array = seleccion.split('.');
-
switch(nombre[nombre.length-2])
-
{
-
case 'campo1_txt': _level0.forma_mc.campo2_txt.setFocus(); break;
-
case 'campo2_txt': _level0.forma_mc.campo3_txt.setFocus(); break;
-
case 'campo3_txt': _level0.forma_mc.campo4_txt.setFocus(); break;
-
case 'campo4_txt': enviarForma(); break;
-
default: break;
-
}
Para que al cargar un swf se ponga el cursor en un campo de texto (ej. campo1_txt) sólo deberás poner el código del setFocus en el primer frame de tu SWF. Como te decía más arriba, si está el campo de texto dentro de un MovieClip no se verá el cursor a pesar de estar en el campo de texto.
-
// Si está dentro de un MovieClip forma_mx
-
forma_mc.campo1_txt.setFocus();
-
// Si no está dentro de un MovieClip
-
campo1_txt.setFocus();
Saludos.
Por segunda vez, me ha resultado súper util al necesitar hacer combos anidados.
Una pregunta, es posible poner un Combobox, con una única opción, y que no se pueda ticar (es decir, esté desactivado pero que se vea la opción primera).
Gracias.
Hola Lucia,
Disculpa la tardanza.
Claro que es posible, si lo haces por medio de ActionScript quedaría de la siguiente forma:
-
cbo_paises.addItem(label:"Argentina", data:12});
-
cbo_paises.selectedIndex = 0;
-
cbo_paises.enabled = false;
Saludos.
Hola Carla, gracias por este genial tutorial, mi pregunta es como puedo insertar a un formulario de contacto dos combobox?? ambos con lista desplegable.
Saludos y muchas gracias por tu ayuda!!!!!!!!!
Hola Mauricio,
Revisa el tutorial de "Enviar formulario de contacto" (http://www.codigometropoli.com/enviar-formulario-de-contacto/), ahí explico cómo enviar la información de un textarea, textfield, combobox, botones de radio, checkboxes, etc. Si lees el tutorial completo te darás cuenta de que es fácil modificarlo a tu gusto (además de que puedes bajar los archivos del tutorial).
Saludos.
Hola Carla,
La verdad que te felicito por el blog, me está sirviendo muchisimo ya que soy nueva en todo esto.
Perdón si es muy descolgada mi pregunta pero estoy tratando de resolver este problema hace mucho y no logro resolverlo sola!!
Mi pregunta es parecida al comentario de Francisco Acosta el Agosto 10, 2008 @ 12:59 pm
Puso 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?..."
Vos dejaste un ejemplo que lo descargue y me sirve perfectamente, pero lo que quisiera saber es que cuando seleccionas uno de los subtemas no me lleve a una url sino que se cargue un movieclip en el mismo archivo, puede ser otro .swf que contenga la información según el subtema que selecciones. Lo que no logro descifrar es el código para que en vez de ir a una url vayas a otro .swf por ejemplo.
Bueno nose si he sido clara pero espero me puedas dar alguna respuesta ya que estoy desorientada, perdón por las molestias!
Desde ya muchisimas gracias y felicitaciones por la buena onda!!
Saludos
Hola Sol,
Imaginando que el MovieClip donde vas a cargar los SWF tenga de nombre de instancia clipo_mc, tendrías que hacer los siguientes cambios:
-
/* En la función almacenaSubtemas, cambiamos el valor de data por el nombre del SWF a cargar: */
-
function almacenaSubtemas(opc) {
-
subtemas = new Array({label:"-- Selecciona --", data:0});
-
if(opc == 1) {
-
subtemas.push({label:"Sección 1", data:"archivo1.swf"});
-
subtemas.push({label:"Sección 2", data:"archivo2.swf"});
-
subtemas.push({label:"Sección 3", data:"archivo3.swf"});
-
}
-
else if(opc == 2) {
-
subtemas.push({label:"Sección 4", data:"archivo4.swf"});
-
subtemas.push({label:"Sección 5", data:"archivo5.swf"});
-
subtemas.push({label:"Sección 6", data:"archivo6.swf"});
-
}
-
else if(opc == 3) {
-
subtemas.push({label:"Sección 7", data:"archivo7.swf"});
-
subtemas.push({label:"Sección 8", data:"archivo8.swf"});
-
subtemas.push({label:"Sección 9", data:"archivo9.swf"});
-
}
-
cbo_subtemas.dataProvider = subtemas.sortOn(["label"]);
-
cbo_subtemas.addEventListener("load", subtemasCargados);
-
cbo_subtemas._visible = true;
-
}
Ahora haremos el cambio en el listener del combo subtemas y en la función que llamamos:
-
cbo_subtemas.addEventListener("change", cargaSWF);
-
function cargaSWF(evento) {
-
clipo_mc.loadMovie(evento.target.selectedItem.data);
-
}
Con esos cambios debería funcionar =0)
Saludos.
Hola Carla
Enhorabuena por estos magnificos tutoriales.
Mi duda es la siguiente y sobre todo esta provocada, por mi atrevida ignorancia en este tema.
Yo tengo una pagina flash en la cual he incluido una sección con varios combobox y campos de formularios a la vez. La primera cuestión es si se pueden mezclar.....??
Y mi segunda duda es, como se introduce el codigo, cuando se tienen varios combos que contienen valores alfabeticos y numericos. Te pongo un ejemplo, en mi formulario se seleccionan marcas de motos, cilidrada y años de antiguedad..y estos los quiero ordenar por orden alfabetico y los numericos en ascendente...
Te agradezco de antemano tu ayuda...Un saludo
Hola Enrique,
Perdona pero no entendí nada de tu pregunta ¿A qué te refieres con "La primera cuestión es si se pueden mezclar"? ¿Qué quieres decir con "como se introduce el codigo"?
Saludos.
Hola felicito de la mejor manera por este tutorial que nos ayuda mucho a todos...
Porfavor necesito que me ayuden en el siguiete problema:
De igual manera que el Combo Box PAISES lo generan con XML; nesesito porfavor que el combo bOx de cuidades tambien este generado con XML.
Porfavor espero me ayuden
Gracias de antemano
tus tutoriales son los mejores que he visto en internet te felicito y espero que sigas para adelante con esta pagina
Ayuda!!! por favor!! estoy atorada con un combobox en la parte para editar, cuando quiero editar un registro que no tiene valor en el combo me selecciona el primer registro de cada combo, yo quisiera que cuando no traiga valor me ponga la leyenda de "Seleccionar una Opción", pero no hace caso al prompt que ya la tiene, alguna sugerencia?, para cuando es un registro nuevo no tengo problema, esto solo me pasa para la edición. ayudaaaaaaaaaa!!1
Hola Luz,
¿Podrías poner tu código o subir un archivo txt con tu código a un servidor para verlo?
Saludos.
Hola Carla es muy interesante la forma en que explicas a detalle todos los elementos, te felicito!!!
Por otra parte quiero pedirte un super favor, la verdad es que apenas me estoy adentrando en flash gracias a tu tutorial pude hacer un combo, ahora el problema que tengo es que solo hice uno y el codigo para enviar no me funciona me podrias explicar como debo hacer para que funcione????
Mil Gracias!!!!
Hola Lilian,
¿Código para enviar? Supongo que te referirás a enviar la opción seleccionada por correo electrónico.
Si es así visita mi tutorial de Enviar formulario de contacto
Saludos.
Hola Carla...
Me da muchisima pena molestarte pero la verdad es que no tengo conocimiento de Flash y se me esta complicando bastante la existencia.
Mira lo unico que necesito es un combo que me despliegue 5 canciones y que el usuario seleccione 1 es para un top 5 y entonces necesito que me mande a mi correo la opcion selecionada para llevar un conteo
la cosa es que ya hice el combo siguiendo tus instrucciones pero el Actionscript se me esta dificultando, ademas en el php no se como modificarlo para que reciba mi informacion y la envie
Te agradezco de antemano tu atencion y paciencia
Hola LILIAN,
Visita el tutorial de Enviar formulario de contacto ahí viene cómo recibir los datos de un combo.
A grandes rasgos es algo así (imaginando que tu combobox tenga como nombre de instancia cancion_cb):
-
import mx.controls.Alert;
-
var enviar_lv:LoadVars = new LoadVars();
-
var resultado_lv:LoadVars = new LoadVars();
-
-
enviar_btn.onRelease = function() { enviarCorreo(); }
-
function enviarCorreo() {
-
enviar_btn.enabled = false;
-
enviar_lv.cancion = cancion_cb.selectedItem.label;
-
enviar_lv.sendAndLoad("enviar_formulario_de_contacto.php", resultado_lv, "POST");
-
}
-
resultado_lv.onLoad = function(success:Boolean)
-
{
-
var respuesta = this.resultado;
-
if(success)
-
{
-
if(respuesta == "S")
-
{
-
Alert.show("Su mensaje ha sido enviado.", "Gracias", Alert.OK, null, "alerta", Alert.OK);
-
}
-
else
-
{
-
Alert.show("Hubo un error en el envío del mensaje, por favor intente más tarde.", "Error", Alert.OK, null, "alerta", Alert.OK);
-
}
-
}
-
else
-
Alert.show("Hubo un error en el envío del mensaje, por favor intente más tarde.", "Error", Alert.OK, null, "alerta", Alert.OK);
-
enviar_btn.enabled = true;
-
};
El código del archivo PHP:
-
<html>
-
<head>
-
</head>
-
<body>
-
<?php
-
$cancion = $_POST["cancion"];
-
$remitente = "no-reply@sudominio.com";
-
$para = "msj1@sudominio.com,msj2@sudominio.com";
-
$asunto = "Mensaje desde Código Metrópoli";
-
$formato_correo = 1;
-
$header = "MIME-Version: 1.0\r\n";
-
$header .= "Content-type: " . $formatos[$formato_correo] . "; charset=iso-8859-1\r\n";
-
$header .= "From: " . $remitente . "\n";
-
if($cancion != "") {
-
$mensaje = "
-
----------------------------------------------------------------------------\n
-
Canción: " . $cancion . "\n
-
----------------------------------------------------------------------------\n";
-
}
-
}
-
if($mensaje != "")
-
{
-
echo '&resultado=S&';
-
else
-
echo '&resultado=N&';
-
}
-
else
-
echo '&resultado=N&';
-
?>
-
</body>
-
</html>
Saludos.
Hola Carla:
1000 gracias x contestarme la verdad es que eres buenisima en esto y bueno para ser sincera esta no es mi rama, pero no me quejare ya que es super interesante aprender sobre cosas que nunca imagine... es por esto que tal vez te hago preguntas super basicas o tontas (lo siento). Ya he seguido todas tus indicaciones pero aun tengo problemas ya que el correo no me llega y siempre me manda el error "Hubo un error en el envío del mensaje, por favor intente más tarde."
no tengo idea que pueda estar mal me ayudas por favor???
te pongo mis codigos y nuevamente muchas gracias por tus tutoriales que estan super y toda la ayuda....
Este es mi codigo en Flash
import mx.controls.Alert;
var canciones:Array = new Array();
var enviar_lv:LoadVars = new LoadVars();
var resultado_lv:LoadVars = new LoadVars();
initForm();
function initForm() {
llenaComboCanciones();
}
function llenaComboCanciones() {
canciones.push({label:"-- Selecciona --", data:0});
canciones.push({label:"cancion 01", data:"1"});
canciones.push({label:"cancion 02", data:"2"});
canciones.push({label:"cancion 03", data:"3"});
canciones.push({label:"cancion 04", data:"4"});
canciones.push({label:"cancion 05", data:"5"});
cbo_canciones.dataProvider = canciones;
cbo_canciones.sortItemsBy("label");
}
enviar_btn.onRelease = function() { enviarCorreo(); }
function enviarCorreo() {
enviar_btn.enabled = false;
enviar_lv.canciones = cbo_canciones.selectedItem.label;
enviar_lv.sendAndLoad("enviar_voto.php", resultado_lv, "POST");
}
resultado_lv.onLoad = function(success:Boolean)
{
var respuesta = this.resultado;
if(success)
{
if(respuesta == "SI")
{
Alert.show("Su Voto se ha enviado.", "Gracias", Alert.OK, null, "Alerta", Alert.OK);
}
else
{
Alert.show("Hubo un error en el envío del mensaje, por favor intente más tarde.", "Error", Alert.OK, null, "alerta", Alert.OK);
}
}
else
Alert.show("Hubo un error en el envío del mensaje, por favor intente más tarde.", "Error", Alert.OK, null, "alerta", Alert.OK);
enviar_btn.enabled = true;
};
Codigo en PHP
UPSSS!!!! no se que pasa que no me inserta el codigo PHP pero bueno en realidad es igual al que me pusiste como ejemplo nada mas que mi variable es "canciones"
De antemano Gracias!!!!
y disculpa lo latosa
Hola Lilian,
Para el envío de correos necesitas tener PHP o ASP. Este ejemplo usa PHP por lo que debes probarlo en un servidor que soporte PHP. Para descartar que sea tu servidor y no el código, crea un archivo PHP (correo.php) con este código:
-
<?
-
$remitente = "Remitente <correo@correo.com>";
-
$para = "Carla Macias <tocorreo@correo.com>";
-
$asunto = "Correo de prueba";
-
$mensaje = "Prueba de envío de correo por PHP";
-
$header = "MIME-Version: 1.0\nFrom: " . $remitente . "\n";
-
$header .= "Content-type: text/html; charset=iso-8859-1;";
-
echo 'Correo enviado';
-
else
-
echo 'Problemas al enviar el correo';
-
?>
No olvides cambiar los correos para probar que te llegan. Salva el archivo, súbelo a tu servidor y abre la página en el navegador para ver qué te muestra.
Saludos.
Muchas Gracias Carla lo probare y claro tratare de ya no molestarte...
Muchas gracias de nuevo
LILIAN
Hola Carla, estado leyendo todo tu tutorual y me parece muy interesnate, resulta que tengo un problema y quisiera que porfavo me des una manito. Bueno te comento el problema:
Pra aempezar trabajo con Flash, amfphp, PHP y mysql
diseñe un formunario donde tengo un datagrid y dentro de uno de los campos carge un combobox, para eso utilize el cellrenderer, hice una clase para el combobox. Ahora el probelam es que no logro cargar datos en el combobox que va dentro del datagrid, teoricamente en la clase del combo es donde tengo que cargar la funcion que llena mi combobox pero no logro hacerlo, nose si tu ya manejaste eso y si me puedes ayudar, te lo agradeceria muchisimo
Escribe un comentario
Nota: Es posible que tu comentario requiera autorización, si es así tu comentario será publicado a la brevedad. Gracias.



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