Comunidad de diseño web y desarrollo en internet online

¿Cómo definir variables dinámicas en AS3?

Citar            
MensajeEscrito el 28 Ene 2008 07:21 pm
Este ejemplo está mal:

for (var i:Number=0; i<elementos.length; i++) {
var elemento+i:TextField= new TextField();
}


¿Cómo podría definir variables de nombre dinámico dentro de este for?

Otro ejemplo similar, podría ser este:

var elementos:Array=["cero","uno","dos","tres"];
for (var i:Number=0; i<elementos.length; i++) {
var miElemento+i:String=elementos[i];
trace(miElemento+i);
}

Por SergioAS3

3 de clabLevel



 

msie7
Citar            
MensajeEscrito el 28 Ene 2008 07:39 pm
sergioAS1, en vez de poner en negritas el texto por que no usas las etiquetas code..
yo lo haria asi.!

Código :

for(var i : int=0;i<10;i++)
this["miElemento"+i] = new TextField();
this["miElemento3"].text = "Este es el texto del elemento 3..";

salu2

Por Zandy

Claber

1345 de clabLevel

5 tutoriales

Genero:Masculino   Premio_Secretos

firefox
Citar            
MensajeEscrito el 28 Ene 2008 09:10 pm
Ten en cuenta que cuando se utiliza actionscript como lenguaje dinámico pierde la capacidad de tipar las variables.

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 28 Ene 2008 09:29 pm
Muchas gracias por la respuesta Boris Van Spilbergen, y me ha hecho gracia lo de SergioAs1 :P

Por SergioAS3

3 de clabLevel



 

msie7
Citar            
MensajeEscrito el 28 Ene 2008 09:36 pm
jajaj ;-), no problem.. ^^

Por Zandy

Claber

1345 de clabLevel

5 tutoriales

Genero:Masculino   Premio_Secretos

firefox
Citar            
MensajeEscrito el 28 Ene 2008 09:38 pm
se me olvidaba, llops , pero puedes hacer un cast a la variable, claro, no deja de ser desaconsejable....

salu2

Por Zandy

Claber

1345 de clabLevel

5 tutoriales

Genero:Masculino   Premio_Secretos

firefox
Citar            
MensajeEscrito el 28 Ene 2008 10:14 pm
Sigo sin saber que es lo que hago mal...

A ver, tengo ejemplo.fla y MenuPpal.as

en el fla:

Código :

import as3.MenuPpal;
var elementosMenu:Array=["cero","uno","dos","tres","cuatro"];
var menu1:MenuPpal=new MenuPpal(elementosMenu);
this.addChild(menu1);


en la carpeta as3 se encuentra el archivo MenuPpal.as con el siguente código:

Código :

package as3{
   import flash.display.Sprite;
   import flash.text.AntiAliasType;
   import flash.text.TextField;
   import flash.text.TextFormat;
   import flash.text.TextFieldAutoSize;
   import flash.text.TextFormatAlign;
   import flash.events.MouseEvent;

   public class MenuPpal extends Sprite {

      private var contenedor:Sprite=new Sprite();
      private var formato1:TextFormat = new TextFormat();
      private var formato2:TextFormat = new TextFormat();

      public function MenuPpal(elementos) {
         
         formato1.font = "Arial";
         formato1.color = 0xcccccc;
         formato1.size = 14;
         formato1.align = TextFormatAlign.RIGHT;

         formato2.font = "Arial";
         formato2.color = 0xf7d117;
         formato2.size = 14;
         formato2.align = TextFormatAlign.RIGHT;

         var posX:Number=0;
         var posY:Number=0;

         for (var i:int=0; i<elementos.length; i++) {

            trace("ELEMENTO: "+elementos[i]);
            //
            this["casillaTxt" + i]= new TextField();
            this["casillaTxt" + i].autoSize = TextFieldAutoSize.LEFT;
            this["casillaTxt" + i].multiline=false;
            this["casillaTxt" + i].selectable = false;
            this["casillaTxt" + i].text = elementos[i];
            this["casillaTxt" + i].x = posX;
            this["casillaTxt" + i].y = posY;
            this["casillaTxt" + i].setTextFormat(formato1);
            addChild(this["casillaTxt"+i]);
            //
            posX=posX+22;
         }
      }
   }
}


El error que me da es el siguente:

ELEMENTO: cero
ReferenceError: Error #1056: No se puede crear la propiedad casillaTxt0 en as3.MenuPpal.
at as3::MenuPpal()
at ejemplo1_fla::MainTimeline/frame1()

Por SergioAS3

3 de clabLevel



 

msie7
Citar            
MensajeEscrito el 29 Ene 2008 07:00 pm
Tu codigo corregido, en tu caso no tienes que crear variables dinamicamente.

Código :

package as3{
   import flash.display.Sprite;
   import flash.text.AntiAliasType;
   import flash.text.TextField;
   import flash.text.TextFormat;
   import flash.text.TextFieldAutoSize;
   import flash.text.TextFormatAlign;
   import flash.events.MouseEvent;

   public class MenuPpal extends Sprite {

      private var contenedor:Sprite=new Sprite();
      private var formato1:TextFormat = new TextFormat();
      private var formato2:TextFormat = new TextFormat();

      public function MenuPpal(elementos) {
         
         formato1.font = "Arial";
         formato1.color = 0xcccccc;
         formato1.size = 14;
         formato1.align = TextFormatAlign.RIGHT;

         formato2.font = "Arial";
         formato2.color = 0xf7d117;
         formato2.size = 14;
         formato2.align = TextFormatAlign.RIGHT;

         var posX:Number=0;
         var posY:Number=0;
         var txf_item:TextField

         for (var i:int=0; i<elementos.length; i++) {
            txf_item = new TextField();

            txf_item.autoSize = TextFieldAutoSize.LEFT;
            txf_item.multiline=false;
            txf_item.selectable = false;
            txf_item.text = elementos[i];
            txf_item.x = posX;
            txf_item.y = posY;
            txf_item.setTextFormat(formato1);
            addChild(txf_item);
            posX=posX+22;
         }
      }
   }
}

Saludos

Por bipsa

628 de clabLevel

1 tutorial
1 articulo

Genero:Masculino  

Colombia

safari
Citar            
MensajeEscrito el 30 Ene 2008 08:43 pm

Joris Van Spilbergen escribió:

se me olvidaba, llops , pero puedes hacer un cast a la variable, claro, no deja de ser desaconsejable....


Joris, hacer un casting únicamente sirve para indicarle al compilador que tu asumes el tipo de la variable en tiempo de compilación, pero eso no quiere decir que la estés tipando,. Si utilizas "lenguaje dinámico", en tiempo de ejecución nunca estará definido el tipo ^^

Saludos!

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 01 Feb 2008 01:48 am

Joris Van Spilbergen escribió:

se me olvidaba, llops , pero puedes hacer un cast a la variable, claro, no deja de ser desaconsejable....

Por qué es desaconsejable?

Digo, el único problema que presentan es que al castear demasiado (y quiero decir DEMASIADO) se pierde performance, ya que el casteo se hace también en runtime.

Por HernanRivas

Claber

3416 de clabLevel

26 tutoriales

 

Argentina

firefox
Citar            
MensajeEscrito el 01 Feb 2008 04:01 am
Yo prefiero aplicar el patrón Factory.

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 01 Feb 2008 09:11 am

HernanRivas escribió:

Joris Van Spilbergen escribió:

se me olvidaba, llops , pero puedes hacer un cast a la variable, claro, no deja de ser desaconsejable....

Por qué es desaconsejable?

Digo, el único problema que presentan es que al castear demasiado (y quiero decir DEMASIADO) se pierde performance, ya que el casteo se hace también en runtime.


Cierto. Y ya no es que sea desaconsejable, es que en AS3 es obligatorio "castear" en muchos casos.

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 01 Feb 2008 04:15 pm

llops escribió:

HernanRivas escribió:

Joris Van Spilbergen escribió:

se me olvidaba, llops , pero puedes hacer un cast a la variable, claro, no deja de ser desaconsejable....

Por qué es desaconsejable?

Digo, el único problema que presentan es que al castear demasiado (y quiero decir DEMASIADO) se pierde performance, ya que el casteo se hace también en runtime.


Cierto. Y ya no es que sea desaconsejable, es que en AS3 es obligatorio "castear" en muchos casos.


Si no la tienes clara te obliga a castear a cada rato... si no, no.... En cuanto al factory pattern, creeria que no es necesario en este caso .... saludos

Por bipsa

628 de clabLevel

1 tutorial
1 articulo

Genero:Masculino  

Colombia

safari
Citar            
MensajeEscrito el 01 Feb 2008 04:31 pm
Aja, tu le demostraste que si se podía hacer sin variables dinámicas. Yo lo que decía es que en lugar de andar casteando variables dinámicas, aplico Factory.

Saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 06 Feb 2008 09:39 pm
y si quisiera borrar esas instancias creadas por la variable del mismo nombre txf_item?

Por Skatos

393 de clabLevel

4 tutoriales

 

firefox
Citar            
MensajeEscrito el 28 Abr 2010 12:20 am


Tengo un problema que todavia no pude resolver, si alguien me ayuda estaria muy agradecido.

Como se ve en la imagen tengo un listado a mostrar, ahora son 3 usuarios nomas porque estoy laburandolo, nunca voy a saber cuantos son y por eso lo creo a partir de variables dinamicas, el problema se sucita cuando se hace click al boton de borrar... deberia capturar el numero de ID y pasarlo a PHP, a partir de aca no tiene importancia, pero obviamente con PHP lo elimino de la base de datos MySQL y devuelvo la respuesta a AS3 (satisfactoria o problemas).

Ahora bien, tengo las variables:
<as>
this["ids"+h] = new TextField();
this["usr"+h] = new TextField();
this["nombre"+h] = new TextField();
this["apellido"+h] = new TextField();
this["email"+h] = new TextField();

this["borrar"+h] = new Borrar();
</as>
Mi idea era hacer esto:
<as>
this["borrar"+h].addEventListener(MouseEvent.CLICK, onBorrar, false, 0, true);
function onBorrar(e:MouseEvent):void {
//VARIABLES BORRAR
var varBorrar:URLVariables = new URLVariables();
varBorrar.ids = this["ids"+h].text;
//RESTO DEL CODIGO
}
</as>

Bueno, no funciona porque es como que no esta mas dentro del for, este ya creo las variables, hizo todo y se fue, para cuando alguien le hace click al boton estas variables dinamicas tienen un nombre, algo como instance49, instance58, etc...

Ahi me surgio la idea de hacer:
<as>
var instanceBorrar = e.currentTarget.name;
var resultInstance = "instance" + instanceBorrar.substrings(8,11)-6;
</as>
ACA TENGO EL NUMERO y con el -6 obtendria el nombre de this["ids"+h] que le corresponda, en teoria.

Luego hacer un "resultInstance.text" y ahi estaria el ID que busco contenido... pero no funciona... se que es ingenuo lo que quize hacer,pero es el manotazo de ahogado.. yo no se que inventar ni como decirle que ese resultInstance es la variable que ando buscando :S...

Quiza es re tonto, quiza no... pero de todas maneras lo quiero hacer, me llevo mucho tiempo llegar a esto y no quiero plantear un listado distinto sin las variables dinamicas, eso lo tengo como ULTIMO recurso.

Aca va el codigo enterito, con respecto a la duda aqui planteada claro.

MUCHISIMAS GRACIAS POR LEERME!!!

Código ActionScript :

   for (var h:uint = 0; h < ids.length; h++) {
      //Crear las variables dinamicamente
      this["ids"+h] = new TextField();
      this["usr"+h] = new TextField();
      this["nombre"+h] = new TextField();
      this["apellido"+h] = new TextField();
      this["email"+h] = new TextField();
      
      this["borrar"+h] = new Borrar();

                //Aplicar el texto del XML a las variables
      this["ids"+h].text = ids[h];
      this["usr"+h].text = usr[h];
      this["nombre"+h].text = nombre[h];
      this["apellido"+h].text = apellido[h];
      this["email"+h].text = email[h];

                this["borrar"+h].addEventListener(MouseEvent.CLICK, onBorrar, false, 0, true);

                function onBorrar(e:MouseEvent):void {
         //VARIABLES BORRAR
         var varBorrar:URLVariables = new URLVariables();
         var instance = e.currentTarget.name.substring(8,11); //Obtengo el numero de instance
         var idsInstance = "instance"+(instance-6);
         varBorrar.ids = this["ids"+h].text; 

Por Lkzwieder

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Abr 2010 06:55 am
El problema que tienes es que la propiedad "name" de "borrar" NO tiene ningún valor. Al menos, yo no lo veo. Vamos, que deberías escribir

Código ActionScript :

for (var h:uint = 0; h < ids.length; h++) { 
      //Crear las variables dinamicamente 
      ....
      this["borrar"+h] = new Borrar(); 
      this["borrar"+h].name = "borrar"+h;  //<--le damos valor a la propiedad
                                  //"name"
      ...
}


Sí, la "propiedad" name (que no tiene nada que ver con el nombre de instancia ni nada de eso) es una propiedad que tienen todos los DisplayObject. Si no la especificas tú, Flash le asigna un nombre cualquiera (es ese "instance" que te sale)
NOTA: NO entendí lo de

Código ActionScript :

var instance = e.currentTarget.name.substring(8,11); //Obtengo el numero de instance 
var idsInstance = "instance"+(instance-6); //<----ESTO(*)
varBorrar.ids = this["ids"+h].text; //<---y ESTO(**)

(*)instance es un string, luego no se le puede restar nada
(**)

Código ActionScript :

//Debería ser
varBorrar.ids=this["ids"+instance].text

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Abr 2010 08:52 pm
Muchas gracias por la respuesta, lo que no entendiste era inentendible hasta para mi que lo hice, no te preocupes por eso. Al final lo resolvi unas horas despues de hacer el post, estando en la cama semi dormido se me ocurrio adjudicarle al boton de borrar una propiedad que sea "Ids", de esta manera:

Código ActionScript :

//El boton captura su id, en una propiedad custom.
      this["borrar"+h].ids = this["ids"+h].text; //ids[h]


Gracias a este detalle cuando hago click en el boton borrar, este mismo tiene alojada en esa propiedad la ID que le corresponde:

Código ActionScript :

function onBorrar(e:MouseEvent):void {
         //VARIABLES BORRAR
         var varBorrar:URLVariables = new URLVariables();
         varBorrar.ids = e.currentTarget.ids;
//Continua el resto de la funcion...


Era casi lo mismo que me sugerias, asi que realmente te agradesco la atencion que le pusiste, ojala que esto le sirva a otros.. no suele verse ejemplos de varialbes dinamicas asi que a aprovechar!

Por Lkzwieder

1 de clabLevel



 

msie7

 

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