Este es un código de ejemplo muy sencillo de cómo asignar funciones con parámetros a botones dinámicamente con un bucle for(); en Actionscript 3.
Este era un recurso muy utilizado en Actionscript 2 cuando teníamos varios botones con nombres con una secuencia numérica (ej: boton1, boton2, boton3 etc..)
Código :
for (var i:Number = 1; i <= 5; i++)
{
this["boton" + i].num = i;
this["boton" + i].onRelease = function()
{
trace("Soy el botón " + this.num);
};
}Hacíamos un típico scope colocando el parámetro (en este caso la variable "num") dentro del objeto botón, y luego el la función que ejecuta el evento onRelease (o el que sea). De esta manera con un this podíamos recuperar ese parámetro y con un if() o un switch() ejecutabamos las funciones correspondientes a cada botón.
En Actionscript 3 no podemos asignar directamente el parámetro al botón ya que nos lanzaría un error:
Código :
ReferenceError: Error #1056: No se puede crear la propiedad num en flash.display.SimpleButton.
¿Cómo podemos hacerlo ahora?
Una solución rápida es recuperar el valor númerico del botón a partir del nombre del clip:
Código :
for (var i:Number = 1; i <= 5; i++)
{
this["boton" + i].addEventListener(MouseEvent.MOUSE_UP,clicBoton);
}
function clicBoton(e:MouseEvent)
{
var nombre:String = e.currentTarget.name;
var num:uint = uint(nombre.replace("boton", ""));
trace("Soy el botón " + num);
}Únicamente recuperamos el nombre del botó clicado y eliminamos el String "boton" con lo que nos queda el numero correspondiente.
Otra opción algo más laboriosa pero que nos permite más control de los parámetros en códigos más complejos sería crearnos una clase que extienda de simpleButton que permita lanzar listeners con parámetros.
Código :
package
{
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import flash.display.SimpleButton;
//-------------------------------------------------
public class BotonScope extends SimpleButton
{
private var _boton:SimpleButton;
private var _param:Object;
private var _listener:Function;
//-------------------------------------------------
public function BotonScope(b:SimpleButton,p:Object)
{
_boton=b;
_param=p;
}
//-------------------------------------------------
override public function addEventListener(type:String,
listener:Function,
useCapture:Boolean = false,
priority:int = 0,
useWeakReference:Boolean = false):void
{
_listener = listener
_boton.addEventListener(type,listenerParam,useCapture,
priority,useWeakReference);
}
private function listenerParam(e:MouseEvent)
{
_listener(e,_param);
}
//-------------------------------------------------
}
}Esta clase simplemente extiende de simpleButton y recibe como parámetro el objeto simpleButton que tengamos colocado en el timeline y también incluiremos un objeto que contendrá los parámetros que nos interesen.
Sobrescribiremos con override la function addEventListener. Lo que haremos es que el listenr ejecute la función interna de la clase que en realidad lo unico que hace es ejecutar la función asignada desde el timelime pero pasandole el objeto con los parámetros:
Código :
_listener(e,_param);
Desde el timeline asignaremos los listeners de esta manera:
Código :
import BotonScope;
for (var i:Number = 1; i <= 5; i++)
{
var param:Object = new Object();
param.num = i;
var boton:BotonScope = new BotonScope(this["boton" + i],param);
boton.addEventListener(MouseEvent.MOUSE_UP,clicBoton);
}
function clicBoton(e:MouseEvent,param:Object)
{
trace("Soy el botón " + param.num);
}Creamos el objeto con los parámetros y lo incluimos dentro del constructor del botón. De esta manera las funciones asignadas al listener recuperarán el objeto con los parámetros internos de cada botón.
Código :
function clicBoton(e:MouseEvent,param:Object)
Haciéndolo de esta manera en cualquier momento podríamos tener acceso a los parámetros en el caso de crearnos unas funciones setter y getter para la propiedad, de manera que también podríamos acceder a ella desde la función del listener de esta manera:
Código :
trace("Soy el botón " + e.currentTarget.param.num);

lo q yo hago aveces por la premura, es meter el i en tabIndex, todo vale en el amor y guarda el i
Por el 21 de Abril de 2008
Por Eliseo el 23 de Abril de 2008
Código :
package { import flash.display.*; public class Boton extends SimpleButton { public var _param:Object; function Boton(){ } public function set param(datos:Object){ _param=new Object(); for (var i:String in datos){ _param[i]=datos[i]; } } public function get param(){ return _param } } }Código :
for (i = 0; i < 5; i++) { var boton:Boton = new Boton() boton.param={num:i} boton.x+=100*i bton.addEventListener(MouseEvent.MOUSE_UP,clicBoton); addChild(boton) } function clicBoton(e:MouseEvent){ trace("soy "+e.target.param.num) }Por Eliseo el 23 de Abril de 2008
Código :
package { import flash.display.*; public dynamic class Boton extends SimpleButton { function Boton(){ } }Ahora
[code]
for (i = 0; i < 5; i++)
{
var boton:Boton = new Boton()
boton.index=i;
boton.x+=100*i
boton.addEventListener(MouseEvent.MOUSE_UP,clicBoton);
addChild(boton)
}
function clicBoton(e:MouseEvent){
trace("soy "+e.target.index)
}
Por martin valero el 01 de Mayo de 2008
martin valero-blog :
Algunas de sus limitaciones, entre ellas la velocidad de ejecucion del mismo Script... Ademas de que ha quedado en el pasado !
Lo mejor es que busques adecuarte al AS3 lo antes posible (creeme, no es tan dificil como crees); ya que es cuestion de tiempo para que Adobe invente algo asi como AS4... El cual te sera aun mas dificil de comprender...
Por un maikel el 02 de Julio de 2008
Por un maikel el 02 de Julio de 2008
Por ed el 14 de Agosto de 2008
Que porquería lo de AS3.
Por ZeaNDigital el 29 de Agosto de 2008
Por chabat el 30 de Septiembre de 2008
Por juanzear el 30 de Diciembre de 2008
que lastiam adobe a ver lelvado este programa a esto
suerte
Por matias el 11 de Marzo de 2009
Por 55 el 24 de Marzo de 2009
Soy otro "perdido" más en esto de migrar AS2 a AS3. Es que casi empezaba a entender AS2 cuando... en fin. Mi pregunta talvez sea un poco tonta, pero no entendí si el código va en una instancia del botón, o en algun frame de la línea de tiempo.
Desde ya gracias !!!
Por exekiel21 el 20 de Agosto de 2011
Código :
private function addButtons(num:uint):void { for (var i:uint = 0; i < num; i++) { var miBoton:Boton = new Boton(); // la clase base es MovieClip miBoton.id = i; miBoton.addEventListener(MouseEvent.CLICK, handlerClick); } } private function handlerClick(e:MouseEvent):void { trace(e.target.id); }Por Norberter el 11 de Noviembre de 2011