Comunidad de diseño web y desarrollo en internet online

Uitlizar nombre de variable procedente de otra variable

Citar            
MensajeEscrito el 13 Ene 2011 09:11 am
Buenos días a todos y felicidades a Cristalab... que cumple años el msimo día que yo.
Tengo un problema que no se cómo resolver.
Tengo en pantalla tres paneles de control, iguales entre sí, que cada uno controla una pantalla con información distinta en cada una (y que nunca puede ser la misma). Como los paneles de control son iguales, he pensado para no repetir programación, utilizar una misma función para los botones similares, distinguiendo de qué panel de control vengo.
Saber en qué panel estoy lo he resuelto con:

stage.addEventListener(MouseEvent.CLICK, reportClick);
function reportClick(event:MouseEvent):void
{
if (event.stageX > 40 && event.stageX < 410 && event.stageY > 40 && event.stageY < 200)
{dcpactivo = "1";}
else if (event.stageX > 460 && event.stageX < 840 && event.stageY > 40 && event.stageY < 200)
{dcpactivo = "2";}
else if (event.stageX > 880 && event.stageX < 1250 && event.stageY > 560 && event.stageY < 720)
{dcpactivo = "3";}
}
El problema comienza cuando pregunto por un valor utilizando este resultado, como en el caso:

if ("pagina"+dcpactivo == "1") // pregunto por el valor de la variable pagina1, pagina2 o pagina3 de cada PdeC
{"pagina"+dcpactivo = "2";} //(esto lo que hace es cambiar de un estado del panel de control a otro)

El error es 1050: No se puede asignar a un valor sin referencia.

Gracias por vuestra ayuda, un saludo

Por potez36

30 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Ene 2011 10:18 am
Algún dato más.
La expresión:
trace ("pagina"+[dcpactivo]);

Devuelve el valor correcto pagina1, pagina2 o pagina3 en función del Panel de Control que pulse. Pero si pregunto por el contenido de la varialbe de ese nombre con

trace (("pagina"+[dcpactivo]).text);

El error es:

1119: Acceso a una propiedad text posiblemente no definida mediante una referencia con tipo estático String.

Por potez36

30 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Ene 2011 11:25 am
Potez tienes que distinguir cuándo estamos usando un STRING y cuándo estamos usando una variable que "hace referencia a un MC".
Así
"pagina1" (es un STRING) NO es lo mismo que pagina1 (es una variable que hacer referencia a un MC)
Así
"pagina1".text NO tiene ningún sentido
pagina1.text sí que tiene sentido

Podemos usar la "notación de corchetes"

Código ActionScript :

this["pagina1"] //es lo mismo que pagina1, si pagina1 es una variable que hace referencia aun MC

Si lo que tenemos es la propiedad "name" de un MC (¡¡OJO no confundir con el nombre de instancia) podemos usar

Código ActionScript :

getChildByName("pagina1_name")


IMPORTANTE, ya que la function reportClick, tiene como argumento una variable de tipo Event -bueno, en este caso de tipo MouseEvent- podemos usar la propiedad "target" de la variable

Código ActionScript :

function reportClick(event:MouseEvent):void
{
  trace(event.target)
}

En general, se suele hacer una "conversión de cast"

Código ActionScript :

function reportClick(event:MouseEvent):void
{
  var obj:DisplayObject=event.target as DisplayObject;
  //ahora usaremos "obj"
  trace(obj)
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Ene 2011 01:10 pm
Muchas gracias por tu ayuda, me ha aclarado muchas cosas
Una rpegunta más:
¿cómo pconsigo entonces pasar el 1, 2 o 3, que es lo que me distingue que panel estoy usando, como parte del nombre de la variable?

if (dcpactivo == "1"&&pagina1 =="1")
{
trace("EL DCP 1 está en la página " + pagina1);

pagina1 = "2";
ta11.text = "FM";
ta21.text = "ATC";
ta31.text = "SURV";
ta41.text = "COM";
ta51.text = "FUEL";
tb11.text = "CARGO";
tb21.text = "TM";
tb31.text = "-";
tb41.text = "-";
tb51.text = ">>>";

}
else if (dcpactivo == "1"&&pagina1 =="2")
{
trace("EL DCP 1 está en la página " + pagina1);
pagina1 = "1";
ta11.text = "NTD1";
ta21.text = "NTD2";
ta31.text = "VIDEO";
ta41.text = "PFD";
ta51.text = "-";
tb11.text = "-";
tb21.text = "-";
tb31.text = "-";
tb41.text = "-";
tb51.text = ">>>";
}
}
La idea que tengo pero no consigo ddesarrollar es en lugar de repetir estos dos IF por cada panel (y así en todas las opciones de navegación de los 3 paneles de control, todo por triplicado), pasar el numero que sí detecto sin problemas de cual es el activo, como parte del nombre de la variable. Por eso intentaba

"ta1"+dcpactivo.text ="NTD1"; -----> ta1 es la parte invariable del nombre del MC, en dcpactivo tengo 1, 2 o3 según el panel que esté usando

Un saludo y gracias

Por potez36

30 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Ene 2011 07:50 am
Volvamos al origen. Tenemos

Código ActionScript :

stage.addEventListener(MouseEvent.CLICK, reportClick);
function reportClick(event:MouseEvent):void
{ 
    var obj:DisplayObject=e.target as DisplayObject
    trace(obj)
     //Voy a hacer algo con él, por ejemplo, desplazarlo hacia la derecha
    obj.x+=100;
}

si hacemos click en cualquier DisplayObject, nos lo moverá.
Para saber cuál es, podemos usar alguna propiedad de "obj". en este caso se suele usar la propiedad "name". Así, si tuviéramos

Código ActionScript :

stage.addEventListener(MouseEvent.CLICK, reportClick);
//le doy valor a la propiedad "name" a los "pagina"
pagina1.name="pagina1";
pagina2.name="pagina2";
pagina3.name="pagina3";
....
function reportClick(event:MouseEvent):void
{ 
    var obj:DisplayObject=e.target as DisplayObject
    trace(obj)
    trace(obj.name) //saldrá "pagina1", ó "pagina2" ó "pagina3"
    var indice:String=obj.name.substr(6)  //saldrá "1" ó "2" ó "3"
    trace(indice)
}

Vale, existe algún concepto un poco "al aire". En primer lugar las instruciones

Código ActionScript :

pagina1.name="pagina1"
pagina2.name="pagina2"

Cuando tenemos en nuestra película .fla una serie de MCs cuyo "nombre de instancia" es "pagina1", Flash lo que hace es crear una "variable que hace referencia a" nuestro MC. Es lo que nos permite escribir

Código ActionScript :

pagina1.x=200  //situa nuestro MC a 200 pixels a la derecha

Pero si hacemos un

Código ActionScript :

trace(pagina.name)   //saldrá algo como "Instance1"

Así que lo que hacemos es cambiarle mediante programación el valor de dicha "propiedad" (no se puede hacer de otro modo). cuando digo propiedad, me refiero a las propiedades de un MovieClip, la "x", la "y", el "width"... son propiedades

Vamos con la instrucción

Código ActionScript :

    var obj:DisplayObject=e.target as DisplayObject

Flash, sobre "e.target" sólo sabe que es un Objeto. Puesto que nosotros sabemos que no es un Objeto sino "algo más", se lo indicamos de esa manera. Yo puedo hacer click en algún MC ó en el Stage, así que, debo elegir ese "algo más" como lo que comparte un MovieClip con el Stage.
Como no queremos que haga nada si hacemos click en el stage, aprovechándonos de la "propiedad" name podemos escribir

Código ActionScript :

function reportClick(event:MouseEvent):void
{ 
    if (e.target.name.substr(0,6)="pagina"){
       var obj:MovieClip=e.target as MovieClip
       trace(obj)
       trace(obj.name) //saldrá "pagina1", ó "pagina2" ó "pagina3"
       ....
    }
}

Observa que, primero comprobamos si el nombre comienza por "pagina", si es así, le decimos a nuestra función que e.target es ahora un "MovieClip". Eso lo hacemos por si nos interesa acceder a los MCs interiores a nuestra "paginas".

Por último, en lugar de explicar lo de substr, te remito a los métodos de la Clase String

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Feb 2011 07:55 am
Probado y resuelto, muchas gracias
Perdón por el retraso en contestar

Por potez36

30 de clabLevel



 

firefox

 

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