electroduendes.com

bitácora de un desarrollador interactivo

electroduendes.com header image 2

Delegate en actionscript: ámbitos y referencias

December 23rd, 2005 · 10 Comments

Actualización: Este post es para AS2. Si trabajas con AS3 ya no hace falta delegate porque la API implementa un modelo que permite que las funciones que manejan los eventos tengan la referencia de la clase por defecto. Más información

Cuando desarrollé mi primer gran proyecto en Actionscript 2.0 con clases, la mayor parte de ellas contenían atributos estáticos “referencia” , o pasaba referencias como propiedad. Parecía que todo en Flash perdía la referencia: asignaba funciones a los onLoad de los parsers, y perdía la referencia, en los onClick de los botones perdía la referencia, los setInterval, venga a pasar referencias… parecía todos los eventos se habían aliado contra mí, :( y eso que ya tenía callo con problemas de referencias.

Pero con Flash 7.2, apareció la clase Delegate.

??ste es un ejemplo de mis frustraciones: un típico parser que simplemente visualiza un XML en un TextField en el que las referencias son todo problemas.

/**
 * @author Alejanadro Sánchez Marcos
 * @usage tutorial de uso de delegate en los parsers.
 * la clase emula un parser básico y su uso común.
 */
class ParserTradicional {
	public var xml:XML;
	public var textoResultado:TextField;
	// ouch!
	public static var ruta:ParserTradicional;
	public function ParserTradicional(URL:String, textoResultado:TextField) {
		xml = new XML();
		// off!
		ruta = this;
		this.textoResultado = textoResultado;
		xml.load(URL);
		// empiezan los problemas...
		// xml.ruta = this; // ay!           
		xml.onLoad = parse;
	}
	public function parse() {
		// no tengo ruta.. mmm meto un atributo estático con la ruta
		// buff!
		trace(ruta.xml);
		ruta.mostrarXML();
	}
	public function mostrarXML() {
		textoResultado.text = xml.toString();
	}
}

y exactamente la misma clase, pero usando delegate.

import mx.utils.Delegate;
/**
* @author Alex Sanchez
* @usage tutorial de uso de delegate en los parsers.
* la clase emula un parser básico y su uso común.
*/
class ParserDelegate {
	public var xml:XML;
	public var textoResultado:TextField;
	public function ParserDelegate(URL:String, textoResultado:TextField) {
		this.textoResultado = textoResultado;
		xml = new XML();
		xml.load(URL);
		// yeeeha!
		xml.onLoad = Delegate.create(this, parse);
	}
	public function parse(success:Boolean) {
		if (success) {
			mostrarXML();
		}
	}
	public function mostrarXML() {
		textoResultado.text = xml.toString();
	}
}

Tags: Actionscript 2.0 · Flash · Metodología, arquitectura

10 responses so far ↓

  • 1 Johan Hernandez // Mar 15, 2006 at 5:31 am

    muy buen articulo amigo… este era mi problema:
    class CargadorImagenes
    {
    private function comenzarBucle():Void
    {
    setInterval(f_bucle,100);
    }
    private function f_bucle():Void
    {

    trace(”f_bucle…”);
    }
    }

    lo solucione asi:

    private function comenzarBucle():Void
    {
    this.bucle_id
    = setInterval(Delegate.create(this, f_bucle),100);

    }

    Sencillo, muchas gracias…

  • 2 Luis Cáceres // Mar 29, 2006 at 10:37 pm

    Hola amigo:
    quizas no sea el lugar para publicar mi duda pero lo que pasa es que trabajo con Macromedia Flex 1.5 y recibo datos de una clase java, la cual me pasa una objeto tipo String que viene con el formato de un XML, yo lo quiero asignar a model y para eso tengo que convertirlo a XML comolo puedo hacer???
    gracias por tu ayuda

  • 3 Alex Sánchez // Mar 30, 2006 at 11:25 am

    hola luis, te recomiendo que para dudas como estas, uses el foro de subflash.

    http://www.subflash.com.

    Allí habrá gente que te podrá resolver dudas concretas.

    De todos modos, para convertir tipos de datos, hay unas funciones en Actionscript que funcionan como conversores de tipos. Las funciones se llaman como el tipo de datos destino y reciben como argumento el tipo a convertir (ej)

    miNumero = Number(miString)

    Pero ya te digo que en el foro podrás tener más info.
    saludos! ;)

  • 4 oles // Aug 31, 2006 at 3:44 pm

    Tengo que hacer un glosario sobre un campo especializado y, como quiero ser la más original (la mayoría de mis compis tienen ahora 21 tacos y no veían La Bola de Cristal), he decidido hacerlo sobre términos electroduendes (mentecátodo, pelabaudios, galvanoplástico).

    Me pregunto si me podías mandar un correo a la dirección mdmv@alu.ua.es diciéndome si controlas el tema para consultarte algunos términos. Gracias.

  • 5 inyaka // Dec 23, 2006 at 7:48 am

    esta clase salvo mi proyecto, cada ves me queda mas clara, si no tuviese tanto sueño me pondría a programar XD

  • 6 Zogocho // Feb 1, 2007 at 1:22 pm

    Hola, tengo una duda, resulta que estoy usando la clase tween pero quiero en ella hacer como variable la parte a la llamada de las clases como ejemplo quiero poner una variable en la parte de Elastic, pero no sé como hacer la sintaxis.

    La pregunta es: ¿como puedo referenciar como variable una ruta de clase?

    Gracias
    (Ricardo= zogocho

  • 7 Zogocho // Feb 1, 2007 at 2:44 pm

    ya lo encontre, de todos modos dejo la solucion aqui adentro:

    var miObjeto:Object = new Object
    miObjeto = mx.transitions.easing.Elastic.easeOut

    new Tween(peliDeDatos, “_xscale”, miObjeto, peliDeDatos._xscale, escala, 3, true);
    new Tween(peliDeDatos, “_yscale”, miObjeto, peliDeDatos._yscale, escala, 3, true);

    Lo que hice fue crear un objeto contenedor de la ruta el cual lo podemos cambiar a gusto

  • 8 Sebastian // Jun 7, 2007 at 9:54 pm

    Gracias, realmente me sirvio… lo que yo hacia para solvar esto… y daun poco de verguenza pero bue.. hacia una nueva clase qeu extiende de XML y le ponia un atributo de la clase qeu lo queria llamar, y despues cuando lo instanciaba le seteaba a ese atributo, this, entonces desde mi clase extendida podia hablar con la que la habia instanciado… pero esto es realmente muy bueno.

    Miles de gracias!!

  • 9 Fernando // Dec 29, 2009 at 7:39 pm

    Hola, solo necesito un ejemplo que me muestre como puedo utilizar el valor de una variable que esta dentro de una funcion, por fuera de ella.

    Tengo esto y no me funciona:

    var MyXML=new XML();
    MyXML.ignoreWhite=true;
    MyXML.onload=cargaXML;
    MyXML.load(”saldo.xml”);
    _global.balanc=0;
    function cargaXML(){
    var saldo=this.firstChild.childNodes[0].attributes.Saldo;
    trace(saldo);// muestra el valor

    _global.balanc=saldo;
    trace(balanc);// muestra el valor
    estado=”cargado”;
    trace(estado);// muestra el valor
    }
    trace(balanc); // indefinido

  • 10 Alex Sánchez // Dec 29, 2009 at 8:05 pm

    prueba con
    trace(_global.balanc);

    o bien con declarar la variable fuera del ámbito de la función y dentro de la función asignarle un valor
    Saludos!

Leave a Comment