A la hora de programar siempre tenemos clips que es están dentro de otros clips y estos tienen a su vez más clips. El problema comienza en la presencia de botones cuando tenemos que deshabilitar todo. La mayoría en un principio intenta haciendo un mc.enabled = false; pero se da cuenta de que solo deshabilita los eventos de ese clip. Para solucionarlo unos empiezan a hacer funciones que van des/habilitando conjuntos de botones y en un proyecto grande termina escribiendo unas 500 líneas de código (otros optan por opciones más desesperadas como poner botones con alpha 0 encima de todos esos conjuntos).
Bueno pude encontrar una solución con solo 1 línea de código. Muchos se deben querer tirar por la ventana como yo por bueno mejor tarde que nunca es el dicho.
Solo se necesita el siguiente método:
Código :
//metodo que des/habilita un clip definitivamente // clip: clip a des/hablitar // valorBoton: valor booleano que tendran los botones dentro del clip // valorClip: valor booleano que tendran los clips dentro del clip establecerEstado = function( clip, valorBoton, valorClip ) { //clips a Analizar var clipsAnalizar:Array = new Array(); //Agruego el clip recibido a la lista de arrays clipsAnalizar.push( clip ); //determina si se detecto el final de la búsqueda finalDetectado = false; //mientras que no se encuentre el final de la búsqueda procedo while ( finalDetectado == false ) { //si tengo clips a analizar procedo if ( clipsAnalizar.length != 0 ) { //extraigo(eliminandolo de la lita) el primer valor de la lista var clipAnalizar = clipsAnalizar.shift(); //Recoro los elementos del clip analizando //nota: la variable objeto no me devuelve un objeto, si no el nombre del objeto // es por eso que mas adelante lo extraigo y no hago algo de mas for ( objeto in clipAnalizar ) { //extraigo del clip analizando el objeto analizando var obj = clipAnalizar[ objeto ]; //Si el elemento es un boton(Si el elemento fue instanciado de la clase Button) procedo if ( obj instanceof Button ) { //Si tengo los valores recibidos para el boton procedo if ( valorBoton != null ) { //Ingreso el valor booleano(que deben tener los botones) en el enabled del boton obj.enabled = valorBoton; } } //Si el elemento es un MovieClip(Si el elemento fue instanciado de la clase Button) procedo if ( obj instanceof MovieClip ) { //Agruego el clip a la lista de clips al final de la lista clipsAnalizar.push( obj ); //Si tengo los valores recibidos para el clip procedo if ( valorClip != null ) { //Ingreso el valor booleano(que deben tener los clips) en el enabled del clip obj.enabled = valorClip; } } } } //Si no me quedan mas clips por analizar procedo else { //Indico que termino la busqueda finalDetectado = true; } } }
Y luego cada vez que quieran des/habilitar un clip solo tienen que llamarlo de la siguiente forma:
Código :
establecerEstado(mc, false, false);
mc no es el nombre de instancia de un clip sino el clip en si, por eso es que va sin comillas
También se puede des/habilitar los eventos de los clips que tenga ese clip. Soporta el ingreso null, por ejemplo si queremos solo des/habilitar los botones y no los clips:
Código :
establecerEstado(mc, false, null);
Estoy seguro que en la mayoría de los casos lo van a dejar los dos en false. Pero por las dudas se lo implemente.
No sé si hay otra forma más fácil de hacerlo, como todos empecé buscando y no encontré nada así que decidí rebuscármelas.
Byee Saludos!
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Zguillez el 17 de Junio de 2009
Por Iván el 17 de Junio de 2009
mouseChildren = false;
Por k4rkuxx el 18 de Junio de 2009
Por wawi el 22 de Junio de 2009
Código :
debajo de el
Código :
si un admin lo ve si puede corrijalo
esto sirbe porque si se desactiva el boton que esta abajo del cursor, que es el que preciono, el cursor de seleccion no se va, pero con el useHandCursor si
note que el tip esta en la categoria AS3, yo lo programe en AS2 no se si servira para as3
Byee Saludos!
Por wawi el 04 de Septiembre de 2009
Código :
el codigo evita los bucles infinitos que seproducen cuando quedan varaibles de _root colgadas
byee Saludos!
Por euflipo el 09 de Octubre de 2009
Tengo unos botones con la siguiente ruta: _root.fondo.stripe_inf.stripe_doble.stripe.instanciaboton y me gustaría que al presionar uno de estos botones, se desactiven todos los botones que hay dentro de _root.fondo.stripe_inf
¿cómo tendría que aplicar este AS? en el frame principal de la movie y en el boton? q AS tengo que poner en cada cual?
muchas gracias por vuestra ayuda
Por wawi el 09 de Octubre de 2009
Código :
para volverlo a habilitar todo pones los dos flase en true, recuerda que con esta funcion no se te ban a deshabilitar los elementos que tengas solo en _root.fondo.stripe_inf, sino los que tienes en este y si hay clips en el mismo los botones que hay dentro de ellos y asi el codigo va recorriedo toda las ramas.
espero haberte ayudado
byee Saludos!
Por euflipo el 09 de Octubre de 2009
Muchísimas gracias por tu rápida ayuda
Ya lo había probado asi, pero no me funcionaba, el problema estaba en que dentro de un clip tenía otro clip copiado 2 veces y en las dos copias tenía puesta la instancia.... Lo que hice, fue dejar una copia sin instancia y asi funciona a la perfección!!
Mil graciasss
Por Sikes el 25 de Marzo de 2010
Una pregunta: Como se hace para aplicar este códogo para cajas de texto de un formulario de contacto??
Por Sikes el 25 de Marzo de 2010
if(obj instanceof TextField){
if(valorBoton != null){
obj.selectable = valorBoton;
obj.useHandCursor = valorBoton;
}
}
Por btho el 26 de Diciembre de 2010
mouseChildren = false;
Por wawi el 11 de Enero de 2011
btho-blog :
mouseChildren = false;
eso es en AS3 pequeñin