Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/01/2009, 16:38
Avatar de jahepi
jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 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