Comunidad de diseño web y desarrollo en internet online

Asignación dinámica de funciones a eventos (Problema)

Citar            
MensajeEscrito el 24 May 2006 09:59 pm
Hola, bueno, antes que nada saludar a todo el mundo, y dar las gracias por esta web tan llena de recursos, que a buen seguro lleva mucho tiempo mantener.

Y lanzo mi pregunta:

Mi problema es que leo de un xml una lista de imágenes, y lo que quiero hacer, es que por cada imagen se cree un botón, que para el evento onLoad cargue la imagen correspondiente. Siguiendo algunos de los tutoriales de ésta página he llegado al siguiente código, pero por algún motivo que desconozco todos los botones creados cargan la misma imágen (la última de la lista).

Pongo a continuación el código, por si alguien ve el error y ó puede orientarme en alguna dirección.
Gracias de antemano.

Código :

var xmlconn:XML=new XML();
xmlconn.ignoreWhite=true;
xmlconn.load("gallery.xml");

function loadButtons(){
   _root.imgloader.autoLoad=false;//imgloader es un componente Loader
   xmlconn.onLoad=function(exito){
      if(exito){
         var list=xmlconn.firstChild.childNodes[3].childNodes;//cargo la lista de imágenes
         for(var i=0;i<list.length-1;i++){
            _root.numbers.attachMovie("ldBtn","ldBtn" add i,i);//ldBtn es un simbolo button de mi biblioteca
            _root.numbers["ldBtn" add i]._x = 22*i;
            _root.numbers["ldBtn" add i]._y = -13;
            _root.numbers["ldBtn" add i]._alpha = 100;
            _root.numbers["ldBtn" add i].text="12";
            
            _root.numbers["ldBtn" add i].onPress = function (){//asigno la función de carga a cada instancia de boton.
               trace(list[i].attributes.src);
               _root.imgloader.contentPath = String (list[i].attributes.src);
               _root.imgloader.load();}
         }
      }
   }
}
loadButtons();

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 12:01 am
Creo que has declarado la variable list dentro del ámbito la función loadButtons() y la llamas desde otra función onPress donde no estará disponible.

Código :

var xmlconn:XML=new XML();
xmlconn.ignoreWhite=true;
xmlconn.load("gallery.xml");
var list = new Array;
loadButtons();

function loadButtons(){
   _root.imgloader.autoLoad=false;//imgloader es un componente Loader
   xmlconn.onLoad=function(exito){
      if(exito){
         list=xmlconn.firstChild.childNodes[3].childNodes;//cargo la lista de imágenes
         for(var i=0;i<list.length-1;i++){
            _root.numbers.attachMovie("ldBtn","ldBtn" add i,i);//ldBtn es un simbolo button de mi biblioteca
            _root.numbers["ldBtn" add i]._x = 22*i;
            _root.numbers["ldBtn" add i]._y = -13;
            _root.numbers["ldBtn" add i]._alpha = 100;
            _root.numbers["ldBtn" add i].text="12";
            
            _root.numbers["ldBtn" add i].onPress = function (){//asigno la función de carga a cada instancia de boton.
               trace(list[i].attributes.src);
               _root.imgloader.contentPath = String (list[i].attributes.src);
               _root.imgloader.load();}
         }
      }
   }
}


Igual le da por funcionar....

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 07:43 am
La he modificado para que "list" esté fuera y onLoad tenga acceso a ella, pero me sigue asignando solo la última imagen a todos los botones. :( . ¿Alguna otra idea?

Código :

var xmlconn:XML=new XML();
var list:Array=new Array();

xmlconn.ignoreWhite=true;
xmlconn.load("gallery.xml");
xmlconn.onLoad=function(exito){
   if(exito){
   list= xmlconn.firstChild.childNodes[3].childNodes;}
   
loadButtons();

function loadButtons(){
   _root.imgloader.autoLoad=false;//imgloader es un componente Loader
   var i=0
   
   for(i;i<list.length-1;i++){
      _root.numbers.attachMovie("ldBtn","ldBtn" add i,i);//ldBtn es un simbolo button de mi biblioteca
      _root.numbers["ldBtn" add i]._x = 22*i;
      _root.numbers["ldBtn" add i]._y = -13;
      _root.numbers["ldBtn" add i]._alpha = 100;
      _root.numbers["ldBtn" add i].text="12";
      
      _root.numbers["ldBtn" add i].onPress = function (){//asigno la función de carga a cada instancia de boton.
         trace(list[i].attributes.src);
         root.imgloader.contentPath = String (list[i].attributes.src);
         _root.imgloader.load();}
         }
   }
}

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 08:08 am
Una pregunta:
En lugar de trace(list[i].attributes.src); cambia a :
trace(list[i].attributes.src +" "+this);
Qué sale en cada click de cada botón?

y otra:
list= xmlconn.firstChild.childNodes[3].childNodes;
Esto carga toda la lista??????

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 08:20 am
Respondiendo a tu primera pregunta, esto es lo que sale en cada boton:

img06.jpg_level0.numbers.ldBtn0
img06.jpg_level0.numbers.ldBtn1
img06.jpg_level0.numbers.ldBtn2
img06.jpg_level0.numbers.ldBtn3
img06.jpg_level0.numbers.ldBtn4

Y respondiendo a tu segunda pregunta, la respuesta es Sí.

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 08:41 am
De nuevo .....esa i del bucle.

trace(list[i].attributes.src +" "+this +" "+i);

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 08:47 am
esto es lo que sale:

img06.jpg _level0.numbers.ldBtn0 5
img06.jpg _level0.numbers.ldBtn1 5
img06.jpg _level0.numbers.ldBtn3 5
img06.jpg _level0.numbers.ldBtn4 5
img06.jpg _level0.numbers.ldBtn5 5

De todos modos la [i] es lógica, tiene que incrementarse con el for, si no, no asignaría la imagen correspondiente ¿no?, asignaría siempre la misma a todos los botones (que por desgracia es lo que está pasando).

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 08:58 am
no, otra variable fuera de ámbito.
Al definir la función , lee la i en _root.numbers["ldBtn" add i].onPress
pero dentro de la función toma el último valor asignado, salida de bucle i++ 4+1 =5

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 09:10 am
¿entonces?¿ otro for dentro de la funcion onRelease?

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 09:17 am
no, pon bien el bucle i.
for(i;i<list.length-1;i++){

es:
for(i = 0; i < list.length; i++){

Esperaba que te dieras cuenta con las pistas :roll: :crap:

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 09:30 am
sigue pasando lo mismo :(

undefined _level0.numbers.ldBtn0 6
undefined _level0.numbers.ldBtn1 6
undefined _level0.numbers.ldBtn2 6
undefined _level0.numbers.ldBtn3 6
undefined _level0.numbers.ldBtn4 6
undefined _level0.numbers.ldBtn5 6

Código :

var xmlconn:XML=new XML();
var list:Array=new Array();

xmlconn.ignoreWhite=true;
xmlconn.load("gallery.xml");
xmlconn.onLoad=function(exito){
   if(exito){
   list= xmlconn.firstChild.childNodes[3].childNodes;}
   
loadButtons();

function loadButtons(){
   _root.imgloader.autoLoad=false;//imgloader es un componente Loader
   
   for(i=0;i<list.length;i++){
      _root.numbers.attachMovie("ldBtn","ldBtn" add i,i);//ldBtn es un simbolo button de mi biblioteca
      _root.numbers["ldBtn" add i]._x = 22*i;
      _root.numbers["ldBtn" add i]._y = -13;
      _root.numbers["ldBtn" add i]._alpha = 100;
      _root.numbers["ldBtn" add i].text="12";
      
      _root.numbers["ldBtn" add i].onPress = function (){//asigno la función de carga a cada instancia de boton.
         trace(list[i].attributes.src+" "+this+" "+i);
         root.imgloader.contentPath = String (list[i].attributes.src);
         _root.imgloader.load();}
      }
   }
}


De verdad, o estoy tonto, o no se qué narices pasa.
Lo más extraño es que la variable list, a pesar de estar definida fuera, su contenido no se conserva para el ámbito de la función onPress.

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 10:58 am
Repito porque parece que me he explicado mal. Sorry.
Si tiene una funcion de evento (que se activa en la llamada) y la llamas, evidentemente, despues de terminar el bucle; Cuánto vale ahora ese valor i ? , Pues el último i++ , Y todos los botones responderan a ESE VALOR cuando pulses.
Igual que con list[i] y ademas ese valor no existe list[6] por eso undefined en el trace.
No se puede hacer así.
Te preparo el código en otro rato, ahora tengo trabajo.
PD. fíjate en el trace de salida de donde puedes coger el valor 0,1,2,3,4,5 en la llamada. Y ahora pulsa un botón y mira el trace ¿? callee y caller.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 11:33 am
Aaaaaaaaaah, es que pensaba que al hacer <onPress=function() > lo que estaba haciendo era una asignación, y que de ese modo, la funcion asignada quedaría con los valores que tuviera la <i>, no que se asignaría en la llamada.

Gracias por el código, cuando puedas claro. La verdad es que soy un neófito en flash ¿se nota mucho? ;) . Y gracias de nuevo.

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox
Citar            
MensajeEscrito el 25 May 2006 12:45 pm
Añade una linea para que quede:

Código :

_root.numbers["ldBtn" add i].onPress = function (){
         i = Number(String(this).substr(-1));
         trace(list[i].attributes.src+" "+this+" "+i);
         root.imgloader.contentPath = String (list[i].attributes.src);
         _root.imgloader.load();}
      }

Ese parche creo que funcionará bien.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 25 May 2006 01:44 pm
te quiero tio. Ya funciona.
Ah, ya veo, recreas el valor de <i> extrayéndolo del nombre del boton ¿no?

Muchísimas gracias. Si tu también necesitas ayuda no dudes en mandarme un pm. Y gracias de nuevo. :D

Por Cybrid

30 de clabLevel



Genero:Masculino  

Bilbao (Spain)

firefox

 

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