Comunidad de diseño web y desarrollo en internet online

Capturar dos textfield visualizdos con solo hacer clip

Citar            
MensajeEscrito el 06 Jun 2010 11:25 am
Como se podría capturar cualquiera de los textfield, del siguiente código, con solo pulsar sobre el contenedor.
function textos_mc() :void {
for (var i:Number = 0; i < my_total; i++) {
var contenedor_mc:MovieClip = new MovieClip();
this.addChild(contenedor_mc);
var modelos_url = my_images[i].@MODELO;;
var textoModelos:TextField = new TextField();
textoModelos.name = "texto" + i;
textoModelos.type = TextFieldType.DYNAMIC;
textoModelos.width = 60;
textoModelos.height = 18;
textoModelos.x = 100;
textoModelos.y = 100;
textoModelos.wordWrap = false;
textoModelos.background = true;
textoModelos.backgroundColor = 0x333333;
textoModelos.selectable = false;
var txtmFrmts:TextFormat = new TextFormat();
txtmFrmts.bold = true;
txtmFrmts.size = 13;
txtmFrmts.color = 0xffcb65;
txtmFrmts.align = TextFormatAlign.RIGHT;
textoModelos.defaultTextFormat = txtmFrmts;
textoModelos.text = modelos_url;
var precio_url = my_images[i].@PRECIO;;
var textoPrecio:TextField = new TextField();
textoPrecio.type = TextFieldType.DYNAMIC;
textoPrecio.width = 60;
textoPrecio.height = 18;
textoPrecio.x = 100;
textoPrecio.y = 116;
textoPrecio.wordWrap = false;
textoPrecio.background = true;
textoPrecio.backgroundColor = 0xffcc32;
textoPrecio.selectable = false;
var txtpFrmts:TextFormat = new TextFormat();
txtpFrmts.bold = true;
txtpFrmts.size = 13;
txtpFrmts.color = 0x000000;
txtpFrmts.align = TextFormatAlign.RIGHT;
textoPrecio.defaultTextFormat = txtpFrmts;
textoPrecio.text = precio_url;
contenedor_mc.addChild(textoModelos); // Agregamos el texto al contenedor
contenedor_mc.addChild(textoPrecio); // Agregamos el texto al contenedor
contenedor_mc.addEventListener(MouseEvent.MOUSE_MOVE, my_Over);
contenedor_mc.addEventListener(MouseEvent.MOUSE_OUT, my_Out);
contenedor_mc.addEventListener(MouseEvent.MOUSE_DOWN, my_Pres);
}
}
function my_Over(evt:MouseEvent) :void {
Mouse.cursor = MouseCursor.BUTTON;
}
function my_Out(evt:MouseEvent) :void {
Mouse.cursor = MouseCursor.ARROW;
}
function my_Pres(evt:MouseEvent) :void {
gotoAndStop(5);
precio_txt.text = (evt.target.text);
modelo_txt.text = (evt.target.text);
}
Gracias por anticipado.

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 07 Jun 2010 06:32 am
Le has dado valor a la propiedad "name" de los "textoModelo" correlativamente (se llaman "texto0","texto1"....)
Deberías darles un nombre único, p.e. "textoMod" a TODOS. De ese modo podrías usar un getChildByName

Código ActionScript :

function my_Pres(evt:MouseEvent) :void {
   var mc:MovieClip=evt.target as MovieClip
   var texto:TextField=mc.getChildByName("textoMod") as TextField
   gotoAndStop(5);
   trace(texto.text)
} 

Sí, estamos haciendo dos "conversiones de cast".
1ª Conversión de cast
La propiedad "evt.target" de tu función es un simple objeto (de la Clase "Object"). Vale, nosotros sabemos que no es así, que es "algo más", de hecho no sólo no es un simple Objeto sino que es un MovieClip. Pero eso lo sabemos nosotros, no el compilador. Así que, si no hacemos una "conversión de cast", NO podremos escribir

Código ActionScript :

//dará error
evt.target.getChildByName("textoMod")

Puesto que nos dará un error de compilador, ya que un "objeto" no tiene un método llaamdo getChildByName
Sí, la "conversión de cast" es ese "as MovieClip"
2ª Conversión de cast
Idénticamente getChildByName devuelve un "displayObject". Nosotros ya sabemos que es "algo más" que un displayObject. De hecho sabemos que es un textField. Por eso hacemos de nuevo una conversión de cast (un displayObject no tiene la propiedad "text"

NOTA:Como sabemos que, dentro de nuestro MC sólo hay dos TextField en la posición 1 y 2, en lugar de darles valor a la propiedad "name" podemos usar getChildAt, con su correspondiente "conversión de cast"

Código ActionScript :

function my_Pres(evt:MouseEvent) :void {
   var mc:MovieClip=evt.target as MovieClip
   var texto1:TextField=mc.getChildAt(0) as TextField
   var texto2:TextField=mc.getChildAt(1) as TextField
   trace(texto1.text)
   trace(texto2.text)
} 

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Jun 2010 04:46 pm
No me funciona, sale:
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Lumens1_fla::MainTimeline/my_Pres()

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 08 Jun 2010 08:05 am

Eliseo2 escribió:

Deberías darles un nombre único, p.e. "textoMod" a TODOS. De ese modo podrías usar un getChildByName

Si no es eso, es que "target" no está siendo los "mc_contenedor". Pon la propiedad mouseEnabled a false a los textos

Código ActionScript :

function textos_mc() :void {
   for (var i:Number = 0; i < my_total; i++) {
       var contenedor_mc:MovieClip = new MovieClip();
       this.addChild(contenedor_mc);
       var modelos_url = my_images[i].@MODELO;;
       var textoModelos:TextField = new TextField();
        //<---añades esta línea----->
       textoModelos.mouseEnabled=false
       ....
    }
}

La propiedad "target" es "a quién le ocurre el evento",
la propiedad "currentTarget" es a quién le hemos añadido el evento.
Resulta confuso estos conceptos, sobre todo porque acostumbramos a escribir target en lugar de currentTarget y los problemas vienen siempre cuando tenemos un MC dentro de otro MC.

Imaginemos que tenemos un MC "mc_contenedor" con un botón "mc_boton" dentro. Tengamos también una caja de texto cuyo nombre de instancia sea "texto"
Escribamos

Código ActionScript :

mc_contenedor.name="contenedor"
mc_contenedor.mc_boton.name="boton"
mc_contenedor.addEventlistener(MouseEvent.CLICK,click)
function click(e:MouseEvent){
       texto.text=e.target.name+":"+e.currentTarget.name
}

Vemos que e.currentTarget va a ser siempre "contenedor" (al que hemos añadido el listener), en tanto que e.target será "boton" si pulsamos al botón y "contenedor" si pulsamos al mc_contenedor en cualquier sitio que no sea el botón.

Cambiemos un poco el código, escribamos ahora

Código ActionScript :

mc_contenedor.name="contenedor"
mc_contenedor.mc_boton.name="boton"
mc_contenedor.mc_boton.addEventlistener(MouseEvent.CLICK,click)
function click(e:MouseEvent){
       texto.text=e.target.name+":"+e.currentTarget.name
}

Vemos que ahora, si pulsamos la mc_contenedor FUERA del botón No hace nada. Si pulsamos al botón, tanto e.target como e.currentTarget será el "boton"

Un último código

Código ActionScript :

mc_contenedor.name="contenedor"
mc_contenedor.mc_boton.name="boton"
mc_contenedor.mc_boton.addEventlistener(MouseEvent.CLICK,click)
mc_contenedor.addEventlistener(MouseEvent.CLICK,click)
function click(e:MouseEvent){
       texto.text+=e.target.name+":"+e.currentTarget.name+"\n"
}

Ahora le hemos añadido el listener tanto al botón como al mc_contenedor. Vemos que, si pulsamos en el "mc_contendedor" FUERA del botón tendremos que tanto target como currentTarget es "contenedor" (nada nuevo). Pero ahora pulsemos al botón vemos dos cosas
1.-Se ejecuta dos veces la función "click"
2.-Una correspondiente al pulsar click al botón, en ella target y currentTarget es el "botón"
3.-La otra correspondiente a pulsar click al Mc contenedor, en el que target es el "boton" y "currentTarget" es el "contenedor".

Te estarás preguntando porqué Flash trabaja así y lo complicado que es. Bueno, realmente no lo es tanto si tenemos la idea siempre en mente que un evento CLICK le ocurre a TODO sobre lo que se pulsa -aunque esté debajo de un MC-. De hecho también le ocurre al stage. Otra cosa es que si no lehemos añadido un listener al stage no lo estemos "capturando". Tiene su ventaja el que funcione así. Por ejemplo tenemos un mc_contenedor flotante (que se puede draguear) con botones dentro. Anteriormente, para draguearlo, teníamos que tener un botón desde donde draguearlo -a modo del título de una ventana de windows- ahora no lo necesitamos. Si añadimos un listener al "mc_contenedor", si target y current target son iguales es que NO hemos pulsado ningún botón, si son distintos es que hemos pulsado un botón.

puff, fin de la chapa
NOTA:Si te estás preguntando si se puede "parar" esa "propagación de eventos", la respuesta es que sí. se puede cambiar la función click por algo como

Código ActionScript :

function click(e:MouseEvent){
       texto.text+=e.target.name+":"+e.currentTarget.name+"\n"
       e.stopPropagation();
}

Y sólo se ejecutará una vez

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2010 05:42 pm
Hola Eliseo, gracias por tus soluciones. Creo que he realizado bien tus explicaciones, pero me sale o me he explicado mal. Cuando pulse sobre cualquiera de los dos textos, quiero que se carguen en una caja de texto dinámica cada uno.
El código he puesto el siguiente, según me comentastes.
function my_Pres(evt:MouseEvent) :void {
var contenedor_mc:MovieClip = evt.target as MovieClip;
var texto1:TextField = contenedor_mc.getChildAt(0) as TextField;
var texto2:TextField = contenedor_mc.getChildAt(1) as TextField;
gotoAndStop(5);
precio_txt.text = texto1;
modelo_txt.text = texto2;
}
El error es el siguiente.
1067: Conversión implícita de un valor de tipo flash.text:TextField a un tipo String no relacionado.
1067: Conversión implícita de un valor de tipo flash.text:TextField a un tipo String no relacionado.
Gracias.

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Jun 2010 06:45 am
texto1 es un TextField, luego tienes que igualar precio_txt.text a texto1.text

Código ActionScript :

var texto1:TextField = contenedor_mc.getChildAt(0) as TextField;
....
precio_txt.text = texto1.text; //<--igualamos las propiedades "text" de los dos TextFields

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2010 11:28 am
Hola Eliseo, ha funcionado correctamente pero ahora cuando intento borrar los textos y el contenedor, habiendo dado valor name a la propiedad de los textos, para poder borrarlos después y no lo logro, la función es la siguiente.
borrarContenedor_btn.addEventListener(MouseEvent.MOUSE_DOWN, borrar);
function borrar (e:MouseEvent) :void {
for (var i:Number = 0; i < my_total; i++) {
var textoModelos:TextField = getChildByName("texto"+i) as TextField;
removeChild(textoModelos);
var textoPrecios = getChildByName("texto" + i);
removeChild(textoPrecios);
var mcs = getChildByName("texto" + i);
removeChild(mcs);
}
this.removeChild(contenedor_mc);
removeChild(container_mc);
gotoAndStop(3);
}
Gracis.

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Jun 2010 02:07 pm
es que "texto1" NO está en la película principal, está dentro de un "contenedor_mc" (que le deberías dar nombre)
getChildByName (o getChildAt) sólo "encuentra" el "DisplayObject" (el Mc, o el TextField) es un método que "pertenece" a un MC o al Stage. Vamos que sería una suerte de

Código ActionScript :

var mc:MovieClip=getChildByName("contenedor_mc") as MovieClip//<--busca un MC que esté
                       //en el stage cuya propiedad name sea "contenedor_mc"

var TextoModelos:TexField=mc.getChildByName("texto"+i) as TextField //<--busca un TextField que esté
                       //DENTRO del MC anterior cuya propiedad name sea "texto"+i

NOTA:Si eliminamos de la displayList los "contenedor_mc" (recuerda que tienes que dar valor a su propiedad name), desaparecerá de la DisplayList con todo lo que tenga dentro)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2010 06:30 pm
Hola Eliseo. He dado nombre al mc y a los textos en su propiedad name y me sigue dando error.
function textos_mc() :void {
for (var i:Number = 0; i < my_total; i++) {
var contenedor_mc:MovieClip = new MovieClip();
contenedor_mc.name = "contenedor_mc" + i;
this.addChild(contenedor_mc);
var modelos_url = my_images[i].@MODELO;;
var textoModelos:TextField = new TextField();
textoModelos.name = "texto1" + i;
textoModelos.type = TextFieldType.DYNAMIC;
textoModelos.width = 60;
textoModelos.height = 18;
textoModelos.x = 290 + (my_textoprecio_x + 100) * x_conta;;
textoModelos.y = 160 + (my_textoprecio_y + 10) * y_conta;
var precio_url = my_images[i].@PRECIO;;
var textoPrecios:TextField = new TextField();
textoPrecios.name = "texto2" + i;
textoPrecios.type = TextFieldType.DYNAMIC;
textoPrecios.width = 60;
textoPrecios.height = 18;
textoPrecios.x = 290 + (my_textoprecio_x + 100) * x_conta;;
textoPrecios.y = 177 + (my_textoprecio_y + 10) * y_conta;
if (x_conta + 1 < columns){
x_conta++;
} else {
x_conta = 0;
y_conta++;
}
textoModelos.wordWrap = false;
textoModelos.background = true;
textoModelos.backgroundColor = 0x333333;
textoModelos.selectable = false;
var txtmFrmts:TextFormat = new TextFormat();
txtmFrmts.bold = true;
txtmFrmts.size = 13;
txtmFrmts.color = 0xffcb65;
txtmFrmts.align = TextFormatAlign.RIGHT;
textoModelos.defaultTextFormat = txtmFrmts;
textoModelos.text = modelos_url;
textoModelos.mouseEnabled = false;
textoPrecios.wordWrap = false;
textoPrecios.background = true;
textoPrecios.backgroundColor = 0xffcc32;
textoPrecios.selectable = false;
var txtpFrmts:TextFormat = new TextFormat();
txtpFrmts.bold = true;
txtpFrmts.size = 13;
txtpFrmts.color = 0x000000;
txtpFrmts.align = TextFormatAlign.RIGHT;
textoPrecios.defaultTextFormat = txtpFrmts;
textoPrecios.text = precio_url;
textoPrecios.mouseEnabled = false;
contenedor_mc.addChild(textoModelos); // Agregamos el texto al contenedor
contenedor_mc.addChild(textoPrecios); // Agregamos el texto al contenedor
contenedor_mc.addEventListener(MouseEvent.MOUSE_MOVE, my_Over);
contenedor_mc.addEventListener(MouseEvent.MOUSE_OUT, my_Out);
contenedor_mc.addEventListener(MouseEvent.MOUSE_DOWN, my_Pres);
}
}
function my_Over(evt:MouseEvent) :void {
Mouse.cursor = MouseCursor.BUTTON;
}
function my_Out(evt:MouseEvent) :void {
Mouse.cursor = MouseCursor.ARROW;
}
function my_Pres(evt:MouseEvent) :void {
for (var i:Number = 0; i < my_total; i++) {
var mcs = getChildByName("texto" + i);
removeChild(mcs);
}
removeChild(container_mc);
var contenedor_mc:MovieClip = evt.target as MovieClip;
var texto1:TextField = contenedor_mc.getChildAt(0) as TextField;
var texto2:TextField = contenedor_mc.getChildAt(1) as TextField;
gotoAndStop(5);
modelo_txt.text = texto1.text;
precio_txt.text = texto2.text;
}
borrarContenedor_btn.addEventListener(MouseEvent.MOUSE_DOWN, borrar);
function borrar (e:MouseEvent) :void {
for (var i:Number = 0; i < my_total; i++) {
var mc:MovieClip = getChildByName("contenedor_mc") as MovieClip;
var TextoModelos:TextField = mc.getChildByName("texto1" + i) as TextField;
var TextoPrecios:TextField = mc.getChildByName("texto2" + i) as TextField;
removeChild(TextoModelos);
removeChild(TextoPrecios);
removeChild(mc);
var mcs = getChildByName("texto" + i);
removeChild(mcs);
}
removeChild(container_mc);
gotoAndStop(3);
}
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Lumens2_fla::MainTimeline/borrar()
Gracias.

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Jun 2010 03:34 pm
Gracias. Ya esta solucionado.

Por Jesus Lopez

10 de clabLevel



 

chrome

 

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