Comunidad de diseño web y desarrollo en internet online

Problema con Componente MenuBar

Citar            
MensajeEscrito el 13 Feb 2006 07:52 pm
Buenas tardes,

La aplicacion que estoy desarrollando consta de varios swf's que se van cargando a nivel de _root. Cada uno de los swf tiene un menuBar con las opciones que se cargan desde un XML.
Estoy intentando hacer un sistema generico que llame a una funcion que carge el menubar con las opciones adecuadas a cada caso, el problema es que la primera vez que hago la llamada funciona todo sin problemas, pero las ocasiones siguientes no recibo los eventos de los subitems del menu cuando hago click en una opcion.
(más curioso, sí recibo los eventos si hago click en la opcion del menu (la que despliega) y sin soltar el boton bajo hasta el subitem correspondiente y suelto el boton sobre el)
El codigo que utilizo es el siguiente:

(En el swf que hace la llamada)
ficheroMenu = "mnuSecciones";
cargarMenu("mnuSecciones");

esta funcion esta en un .as externo que tengo con #include
function cargarMenu(cual){
_root.createEmptyMovieClip("elMenu",10000);
_root.elMenu.loadMovie("barraMenu.swf","POST");
_root.elMenu._x = 0;
_root.elMenu._y = 0;
// Esto es para esperar a que barraMenu esté cargardo por completo
this.onEnterFrame = function() {
if (_root.elMenu.getBytesLoaded() != 0 && _root.elMenu.getBytesLoaded() == _root.elMenu.getBytesTotal()) {
_root.ficheroMenu = cual;
delete this.onEnterFrame;
}
};
}

barraMenu.swf contiene un menubar en el escenario y el siguiente codigo:
var menuXML:XML = new XML();
menuXML.ignoreWhite = true;
menuXML.onLoad = function(exito){
if(exito){
var alCambiar:Object = new Object();
alCambiar.change = function(evento){
var menu = evento.menu;
var item = evento.menuItem;
trace(item.attributes.accion);
if(item.attributes.accion=="salir"){
// Con esto vuelvo a cargar el clip principal que llama a esta pelicula
cargarPelicula("Citas");
}else{
cargarPelicula(item.attributes.accion);
}
}

for(i=0;i<menuXML.childNodes.length;i++){
// Coger el nombre del menu
barramenu["menu"+i] = barramenu.addMenu(menuXML.childNodes[i].attributes["label"]);
for(j=0;j<menuXML.childNodes[i].childNodes.length;j++){
if(menuXML.childNodes[i].childNodes[j].attributes["type"] == ""){
itemMenu = barramenu["menu"+i].addMenuItem({label:menuXML.childNodes[i].childNodes[j].attributes["label"],
instanceName:menuXML.childNodes[i].childNodes[j].attributes["instanceName"],
accion:menuXML.childNodes[i].childNodes[j].attributes["accion"]});
}else{
barramenu["menu"+i].addMenuItem({type:"separator"});
}
} // for j
barramenu["menu"+i].addEventListener("change", alCambiar);
} // for i
} // if(exito)
} // function
// La variable ficheroMenu la establezco desde la funcion que llama a esta pelicula
menuXML.load(_root.ficheroMenu+".xml");

la funcion cargarPelicula esta un .as externo que cargo con un #include y su codigo es este

function cargarPelicula(cual){
_root.createEmptyMovieClip("Cierre",5000);
_root.Cierre.loadMovie("cerrarPelicula.swf","POST");
_root.Cierre._x = 0;
_root.Cierre._y = 0;
// Esto es para esperar a que cerraPelicula esté cargardo por completo
this.onEnterFrame = function() {
if (_root.Cierre.getBytesLoaded() != 0 && _root.Cierre.getBytesLoaded() == _root.Cierre.getBytesTotal()) {
_root.Cierre.cargar = cual;
delete this.onEnterFrame;
}
};
}

cerrarPelicula.swf hace un efecto de cortina de cierre y cuando finaliza ejecuta el siguiente codigo:
delete _root.barramenu.alCambiar;
mcMenu=_root.getInstanceAtDepth(10000);
mcMenu.unloadMovie();
_root.unloadMovie();
_root.loadMovie(this._parent._parent.cargar+".swf");

Perdón por el ladrillo de código y gracias por vuesta ayuda.

Por ytalisoft

17 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 14 Feb 2006 01:57 pm
No entiendo lo que sucede, he cambiado el codigo para ponerlo todo en el mismo swf, ahora lo hago de este modo:

_root.attachMovie("MenuBar","barramenu",10000,{_x:0, _y:0, _width:Stage.width});
var alCambiarMenu:Object = new Object();
alCambiarMenu.change = function(evento){
var menu = evento.menu;
var item = evento.menuItem;
trace(item.attributes.accion);
if(item.attributes.accion=="salir"){
// Con esto vuelvo a cargar el clip principal que llama a esta pelicula
cargarPelicula("Citas");
}else{
cargarPelicula(item.attributes.accion);
}
}

var menuXML:XML = new XML();
menuXML.ignoreWhite = true;
menuXML.onLoad = function(exito){
if(exito){
for(i=0;i<menuXML.childNodes.length;i++){
// Coger el nombre del menu
barramenu["menu"+i] = barramenu.addMenu(menuXML.childNodes[i].attributes["label"]);
for(j=0;j<menuXML.childNodes[i].childNodes.length;j++){
if(menuXML.childNodes[i].childNodes[j].attributes["type"] == ""){
itemMenu = barramenu["menu"+i].addMenuItem({label:menuXML.childNodes[i].childNodes[j].attributes["label"],
instanceName:menuXML.childNodes[i].childNodes[j].attributes["instanceName"],
accion:menuXML.childNodes[i].childNodes[j].attributes["accion"]});
}else{
barramenu["menu"+i].addMenuItem({type:"separator"});
}
} // for j
barramenu["menu"+i].addEventListener("change", alCambiarMenu);
} // for i
} // if(exito)
} // function
// La variable ficheroMenu la establezco desde la funcion que llama a esta pelicula
menuXML.load(_root.ficheroMenu+".xml");

El resultado es el mismo. La primera vez funciona, las siguientes no.
Desde el Probar pelicula, la segunda vez que se lllama al menu no salen los titulos, sino undefined, pero desde el explorador salen los titulos correctamente pero no funciona el click.

Les agradeceria que me ayudasen con esto.

Por ytalisoft

17 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Feb 2006 02:45 pm
Bien, el problema estaba en los _root.loadMovie (ignoro el porque), pero los he sustituido por _root.getURL() y ahora funciona corretamente.

Gracias a todos

Por ytalisoft

17 de clabLevel



Genero:Masculino  

firefox

 

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