Foros del Web » Creando para Internet » Flash y Actionscript »

Menu dinámico

Estas en el tema de Menu dinámico en el foro de Flash y Actionscript en Foros del Web. Hola amigos De nuevo con otra duda, a ver si ya han hecho algo como esto: Tengo un ejemplo que abre un TitleWindow: Código: <mx:Panel ...
  #1 (permalink)  
Antiguo 02/01/2009, 19:53
 
Fecha de Ingreso: agosto-2008
Mensajes: 7
Antigüedad: 15 años, 7 meses
Puntos: 0
Menu dinámico

Hola amigos

De nuevo con otra duda, a ver si ya han hecho algo como esto:

Tengo un ejemplo que abre un TitleWindow:
Código:
<mx:Panel title="TitleWindow Container Example" height="75%" width="75%" paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10">
        <mx:Button id="myButton" label="Click to open the TitleWindow container"   click="showWindow();"/>
        <mx:Text id="returnedName" text="" width="100%"/>
</mx:Panel>

<mx:Script>
     <![CDATA[
          import mx.managers.PopUpManager;
          import mx.containers.TitleWindow;
          import flash.geom.Point;

          private var point1:Point = new Point();

          private function showWindow():void {
               var login:SimpleTitleWindowExample=SimpleTitleWindowExample(PopUpManager.createPopUp( this, SimpleTitleWindowExample , true));
               point1.x=0;
               point1.y=0;                
               point1=myButton.localToGlobal(point1);
               login.x=point1.x+25;
               login.y=point1.y+25;
               login.loginName=returnedName;
         }
     ]]>
</mx:Script>
En este código hago referencia a un TitleWindow (SimpleTitleWindowExample) y y se abre con el botón. Eso es evidente no ?

Bueno, imaginense que quiero hacer esto con 50 o 100 TitleWindow's, serian 100 botones o 100 opciones en el menú y por cada opción haria referencia a cada TitleWindow que corresponde, pues es bastante.

Lo que quiero hacer es una sola Clase que solo le pase el nombre del TitleWindow o de cualquier componete y me lo abra, asi guardaria los nombre tal vez en una BD y los podria manejar desde una aplicación. No tendria que estar desplegando el proyecto cada vez que se agregara una nueva pantalla.

Ya estuve buscando varios códigos, pero ninguno hace lo que necesito. Solo orientandome sobre lo que debo usar por favor o si alguien ya lo ha hecho.... se los agredeceria muchisimo.

JimRam.
  #2 (permalink)  
Antiguo 06/01/2009, 16:38
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 3 meses
Puntos: 43
Respuesta: Menu dinámico

Hola Jimram !

Puedes utilizar una función muy útil que se encuentra en el paquete flash.utils.getDefinitionByName.

Un ejemplo de implementación:
Código actionscript:
Ver original
  1. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()">
  2.    
  3.     <mx:Script>
  4.         <![CDATA[
  5.             import mx.managers.PopUpManager;
  6.             import flash.utils.getDefinitionByName;
  7.            
  8.             [Bindable]
  9.             private var _data:Array;
  10.            
  11.             private function init():void {
  12.                 _data =
  13.                     [{label:'Componente1', data:'componentes.Comp1'},
  14.                     {label:'Componente2', data:'componentes.Comp2'}];
  15.             }
  16.            
  17.             private function onClick():void {
  18.                 var data:String = cb.selectedItem.data;
  19.                 var ClassRef:Class = getDefinitionByName(data) as Class;
  20.                 PopUpManager.createPopUp(this, ClassRef, true);
  21.             }
  22.            
  23.         ]]>
  24.     </mx:Script>
  25.    
  26.     <mx:ComboBox dataProvider="{_data}" id="cb" />
  27.     <mx:Button label="Button" click="onClick()"/>
  28.    
  29. </mx:Application>

Puedes ver que en el paquete 'componentes' se encuentran todos los componentes valga la redundancia y con la función getDefinitionByName obtengo la referencia a la clase, pero aquí hay un pequeño problema, debemos de forzar al compilador que incluya la clases que estamos generando dinámicamente, si lo compilas como esta, te va a dar un error en tiempo de ejecución cuando intentes instanciar una clase al dar click al botón.

Para resolver esto, tienes que crear variables de los tipos que vas a instanciar en tiempo en ejecución para que el compilador las agregue:

Código actionscript:
Ver original
  1. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()">
  2.    
  3.     <mx:Script>
  4.         <![CDATA[
  5.             import mx.managers.PopUpManager;
  6.             import flash.utils.getDefinitionByName;
  7.                        import componentes.*; //Nueva línea
  8.            
  9.             [Bindable]
  10.             private var _data:Array;
  11.                        
  12.                         //Con esto el compilador las añadirá.
  13.                         private var _c1:Comp1; //Nueva línea
  14.                         private var _c2:Comp2; //Nueva línea
  15.            
  16.             private function init():void {
  17.                 _data =
  18.                     [{label:'Componente1', data:'componentes.Comp1'},
  19.                     {label:'Componente2', data:'componentes.Comp2'}];
  20.             }
  21.            
  22.             private function onClick():void {
  23.                 var data:String = cb.selectedItem.data;
  24.                 var ClassRef:Class = getDefinitionByName(data) as Class;
  25.                 PopUpManager.createPopUp(this, ClassRef, true);
  26.             }
  27.            
  28.         ]]>
  29.     </mx:Script>
  30.    
  31.     <mx:ComboBox dataProvider="{_data}" id="cb" />
  32.     <mx:Button label="Button" click="onClick()"/>
  33.    
  34. </mx:Application>

Como ves, está un poco sucia la solución pero es la única forma de resolverlo, otra forma es decirle al compilador que añada las clases sin recurrir a lo anterior.

Das click derecho sobre el proyecto->propiedades->Compilador Flex
Añades la siguiente directiva en el campo argumentos adicionales de compilación:

-includes=componentes.Comp1,componentes.Comp2

Con esto ya no necesitamos declarar las variables como en la forma anterior pero sigue siendo una solución donde vas a tener que abrir el proyecto y volverlo a recompilar si agregas más clases.

Un saludote !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.

Última edición por jahepi; 06/01/2009 a las 23:22
  #3 (permalink)  
Antiguo 08/01/2009, 12:35
 
Fecha de Ingreso: agosto-2008
Mensajes: 7
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Menu dinámico

Muchas Gracias jahepi, me ayudo mucho el ejemplo que pusiste, aunque como dices, tengo que vovler a recompilar el proyecto cada vez que agrege mas clases. Esa es la finalidad a la que quiero llegar.

Seguimos buscando....

Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:13.