Comunidad de diseño web y desarrollo en internet online

combobox dinamico

Citar            
MensajeEscrito el 06 Mar 2009 09:36 pm
hola a todos, como andan???
bueno, tengo una duda medio rara.
es asi:
yo tengo un bd, desde donde recupero una cantidad de TextField.
en una funcion de una clase mediante un for recupero los datos, ya que ademas de la cant de textfield, tengo otros elementos:

Código :

t = resultado.serverInfo.initialData;
      for(i=0; i<t.length; i++)
         {
}

la cuestion viene, en que necesito crear un comboBox por cada TextField creado, a este ComboBox lo necesito llenar con numeros, que van en un rango, desde un min a un max q tb recupero de la base de datos y ademas hacer, que al seleccionar un item, se modifique el TextField correspondiente al ComboBox seleccionado.

basicamente seria:
RECUPERO:
size_min, size_max, idcampo_txt

entonces hago:

Código :

public function textos(resultado:Object):void 
      {
t = resultado.serverInfo.initialData;
for(i=0; i<t.length; i++)
{
//cargo los TextField
SalidaText = new TextField();
SalidatText.width = 100
SalidaText.height = 20
SalidaText.selectable = false;
SalidaText.border=true
//etc de propiedades
addChild(SalidaText);

//recupero rango de valores
size_min = Number(t[i][6]);
size_max = Number(t[i][7])

//Cargo los ComboBox
tamanioFuente = new ComboBox();
tamanioFuente.x = 120
tamanioFuente.y = 80
tamanioFuente.editable = false;
//etc propiedades
//despues quisiera cargar los datos, a cada uno de los ComboBox recuperados:
for (k =size_min; k < size_max; k++ )
            {
            tamanioFuente.addItem( { label:k} );
               //trace ("arrgeglo: " + k);
            }
}
addChild(tamanioFuente);
//agrego funcion de seleccion
tamanioFuente.addEventListener(Event.CHANGE, cambiarTamanioTexto);
}
//funcion de seleccion
function cambiarTamanioTexto(evt:Event):void
      {
            formato.size = evt.target.selectedItem.label; 
            outputText.setTextFormat(formato); 
      }


bueno, resulta que se tilda el flash al hacer esto, entonces probe con valores de 1 a 5 y los carga, sin embargo los hace a todos los comboBox y cada combo, tiene valores diferentes.

y despues, la seleccion, funciona, pero todos los combox cambian al ultimo campo de texto creado, supongo q es por la superposicion de indices, pero como veran, no puedo solucionarlo

he probado varias cosas sin embargo no puedo hacer correspondencia de rangodetamaños-combobox-textfield
que es lo q necesito.

si pueden ayudarme se los agradeceria mucho
desde ya gracias.

saludos

Por qwertydrc

6 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 07 Mar 2009 02:21 pm
Hola Marcelo ;)

Puedes copiar y pegar este code en la línea de tiempo de tu peli. Crea tres campos dinámicos, el rango de tamaño es al azar dentro de ciertos límites. Echale un ojo, luego lo tienes que adaptar a la clase y a los datos que te vienen de la BD

Código ActionScript :

import fl.controls.ComboBox

function textos(t:Number):void {
   for (var i:Number =0; i<t; i++) {
      //cargo los TextField
      var SalidaText:TextField = new TextField();
      SalidaText.width=100;
      SalidaText.height=40;
      SalidaText.selectable=false;
      SalidaText.border=true;
      SalidaText.y = i*45
      SalidaText.text = "Hola"
      SalidaText.name = "texto"+i
      //etc de propiedades
      addChild(SalidaText);
      //recupero rango de valores
      var base:Number = int(Math.random()*10)+10
      var size_min:Number =base;
      var size_max:Number=base+10;

      //Cargo los ComboBox
      var tamanioFuente:ComboBox = new ComboBox();
      tamanioFuente.x=120;
      tamanioFuente.y=45*i;
      tamanioFuente.editable=false;
      tamanioFuente.name="combo"+i;
      //agrego funcion de seleccion
      tamanioFuente.addEventListener(Event.CHANGE, cambiarTamanioTexto);         
      addChild(tamanioFuente);
      //etc propiedades
      //despues quisiera cargar los datos, a cada uno de los ComboBox recuperados:
      for (var k:Number =size_min; k < size_max; k++) {
         tamanioFuente.addItem( { label:k } );
         //trace ("arrgeglo: " + k);
      }
   }
}
//funcion de seleccion
function cambiarTamanioTexto(evt:Event):void {
   var formato:TextFormat = new TextFormat()
   formato.size=evt.target.selectedItem.label;
   var nr:Number = evt.target.name.substr(5)
   TextField(this.getChildByName("texto"+nr)).setTextFormat(formato);
}
textos(3)


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Mar 2009 07:53 pm
gracias jorge por la respueta.

pude recuperar los datos y crear los combo, pero sin embargo los listener no funcionan:

la clase quedo asi:

Código :

public function datos(resultado:Object):void 
      {
      /**
       * Guardo los resultados recuperados
       */
         t = resultado.serverInfo.initialData;
      for(i=0; i<t.length; i++)
         {
         comboCategoria.addItem( { idcampo_txt:t[i][0], tamanio_w:t[i][1], tamanio_h:t[i][2], pos_x:t[i][3], pos_y:t[i][4], nbre_imagen:t[i][5], size_min:t[i][6], size_max:t[i][7]} );   
         comboCategoria.x = 5;
         comboCategoria.y = 5;
         
         
         trace ("fuentes: " + t[i][0]);
         
         inputText = new TextArea();
         //le damos nombre al inputText 
         inputText.name="input"+i.toString(); 
         inputText.setSize(314, 88);
         inputText.editable = true;
         inputText.alwaysShowSelection = true;
         inputText.move(452, (165 * i + 70));
         inputText.text = "campo de texto listo para escribir";
         addChild(inputText);
         
         
         outputText = new TextField();
         //idem para el outputText 
         outputText.name="output"+i.toString();
         outputText.width = Number(t[i][1]);
         outputText.height = Number(t[i][2]);
         outputText.selectable = false;
         outputText.border=true
         outputText.x = cargarImagen.x+Number(t[i][3]);
         outputText.y = cargarImagen.y+Number(t[i][4]);
         outputText.text = "campo de texto: " + t[i][0];
         outputText.mouseEnabled = false;
         outputText.multiline = true;
         outputText.wordWrap = true;
         addChild(outputText);
         
         formato = new TextFormat();
         //formato.color = 0x924834;
         
         picker = new ColorPicker();
         //idem para el outputText 
         picker.name = "picker" + i.toString();
         picker.x = 740;
         picker.y = (170 * i) + 155;
         addChild(picker);
         
         
         size_min = Number(t[i][6]);
         size_max = Number(t[i][7]);
         
         
         tamanioFuente = new ComboBox();
         tamanioFuente.name = "combo" + i.toString;
         tamanioFuente.x = picker.x - 120;
         tamanioFuente.y = picker.y;
         tamanioFuente.editable = false;
         for (k= size_min; k < (size_max+1); k++)    
         { 
            tamanioFuente.addItem( { label:k, data:k } );
         };
         addChild(tamanioFuente);
         
         
         inputText.addEventListener(Event.CHANGE, cambiarTexto);         
         tamanioFuente.addEventListener(Event.CHANGE, cambiarTamanioTexto);
         picker.addEventListener(ColorPickerEvent.CHANGE, cambiarColorTexto);
         
         }      
      }
      
      function cambiarTexto(evt:Event):void  
      {    
         var inputText = TextArea(evt.target);
         var outputText = TextField(getChildByName("output" + inputText.name.substr(5)));
         //recogemos el formato que tuviera 
         var formato:TextFormat=outputText.getTextFormat();  
         outputText.text = inputText.text;   
         //le aplicamos el formato 
         outputText.setTextFormat(formato);  
      }  
      
      function cambiarTamanioTexto(evt:Event):void 
      { 
         var tamanioFuente = ComboBox (evt.target);
         var outputText = TextField(getChildByName("output" + tamanioFuente.name.substr(5)));
            //por tanto la variable outputText "apunta" a TextField output# 
            formato.color = picker.selectedColor;
            outputText.setTextFormat(formato); 

//TAMBIEN PROBE ESTA FORMA, PERO NO FUNCIONA
/*
var formato:TextFormat = new TextFormat() 
   formato.size=evt.target.selectedItem.label; 
   var nr:Number = evt.target.name.substr(5) 
   TextField(this.getChildByName("output"+nr)).setTextFormat(formato); 
*/
      }


no se si habria alguna otra forma de poder reproducir o hacer funcionar el listener

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

firefox
Citar            
MensajeEscrito el 09 Mar 2009 09:08 pm
En mi ejemplo, creo dinámicamente combo1, combo2, combo3, luego tomo el nro del final del nombre para apuntar a output1, output2, output3, etc. En tu caso no le estas dando un nombre a tu combo, sino que estás apuntando a la variable que usas para la creación (tamanioFuente ) Deberías agregar una línea:

tamanioFuente.name = "combo"+t

Luego también al campo de texto

outputText.name = "texto"+t

Luego pillas la referencia así:

var outputText = TextField(getChildByName("output" + evt.target.name.substr(5));

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Mar 2009 09:20 pm
si jorge, entiendo lo q me decis, pero ambos tiene nombre, tanto el combo box como el output text.
mira estas son las lineas:

Código :

inputText = new TextArea();
//le damos nombre al inputText 
inputText.name="input"+i.toString(); 

outputText = new TextField();
//idem para el outputText 
outputText.name="output"+i.toString();

//y finalmente el combobox tambien tiene:
tamanioFuente = new ComboBox();
tamanioFuente.name = "combo" + i.toString;


por eso es raro q no funcione de ninguna de las 2 formas
saludos

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

firefox
Citar            
MensajeEscrito el 09 Mar 2009 09:33 pm
Bien, lo siguiente es ver en que punto falla. Las dos primeras hipótesis son: el nombre se contruye mal, no encuentra el elemento. Para lo primero se traza:

trace("Nombre output"+nr)

¿Tiene sentido?
Luego, ¿existe?

trace(getChildByName("output" + nr)

Si en algún punto obtienes el 1009 (no existe blah blah blah) entonces ese textfield no ha sido creado, o no donde crees. Para comprobar esto voy al momento de la creación y digo: si lo agregué, existe

outputText.name="output"+i.toString();
addChild(outputText)
getChildByName("output"+i)

Si existe, puede que no esté en el mismo sitio cuando lo creo y dentro del handler. Un trace(this) en ambos sitios me debería trazar lo mismo. Si sigue sion existir, puedo user un for in sobre todos los childrens, mostrando el nombre de lo que hay (el nombre de mi campo de texto debería aparecer) Se pueden chequear unas cuantas cosas más, pero empieza por esas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Mar 2009 09:52 pm
si, pasa que ademas de este combo para cambiar el tamaño, tengo un colorpiker, el cual funciona perfectamente, con los mismo parametros y sin dar ningun error.

por lo que creo es algo referido a la referencia de como se ejectuta el listener en el combobox.

el codigo q tengo para los ColorPikers son:

Código :


//esto dentro del for
/**
          * creo el TextFormat, formato a ser utilizado en los textos
          */
         formato = new TextFormat();
         
         /**
          * creo los ColorPiker, los cuales daran color a los TextField
          */
         picker = new ColorPicker();
         //idem para el outputText 
         picker.name = "picker" + i.toString();
         picker.x = 740;
         picker.y = (170 * i) + 155;
         addChild(picker);

picker.addEventListener(ColorPickerEvent.CHANGE, cambiarColorTexto);
//hasta este punto.

//la funcion va fuera del for
function cambiarColorTexto(evt:ColorPickerEvent) 
      {
            var picker = ColorPicker (evt.target);
         var outputText = TextField(getChildByName("output" + picker.name.substr(6)));
            //por tanto la variable outputText "apunta" a TextField output# 
            formato.color = picker.selectedColor;
            outputText.setTextFormat(formato); 
      } 

Por bubudrc

Claber

591 de clabLevel

1 tutorial

 

mayo 2006

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.