2010-01-29 9 views
5

He estado teniendo un problema que me ha plagado muchas veces durante el desarrollo de un proyecto de Flash. Se ve algo como esto:¿Cuál es la forma correcta de agregar componentes a la biblioteca de un Swf?

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at fl.containers::BaseScrollPane/fl.containers:BaseScrollPane::drawBackground() 
at fl.controls::TileList/fl.controls:TileList::draw() 
at fl.core::UIComponent/::callLaterDispatcher() 
TypeError: Error #2007: Parameter child must be non-null. 
at flash.display::DisplayObjectContainer/addChildAt() 
at fl.controls::BaseButton/fl.controls:BaseButton::drawBackground() 
at fl.controls::BaseButton/fl.controls:BaseButton::draw() 
at fl.core::UIComponent/drawNow() 
at fl.controls::ScrollBar/fl.controls:ScrollBar::draw() 
at fl.core::UIComponent/::callLaterDispatcher() 

Ahora, en mi caso, este error se debe a la inicialización de los componentes de código cuando no se han añadido explícitamente a la biblioteca de componentes de la FLA en CS4. En el pasado, me he encontrado con este problema al intentar crear dinámicamente ScrollPanes en el código. Lo he resuelto agregando componentes de ScrollPane a la biblioteca de Main.fla. Esto pareció funcionar por un tiempo.

Ahora, estoy tratando de usar un cuadro AstraFlash Autocompletar. Importé los archivos fla adecuados en CS4 y coloqué un cuadro Autocompletar en mi Swf. Todo se compila bien, pero el error anterior se produce cuando se carga el Swf. Mi idea es que el cuadro Autocompletar está intentando crear un ScrollPane como parte de su funcionalidad. Ok, entiendo esto, así que agrego el componente ScrollPane a la biblioteca también con los mismos resultados.

Por lo general, me gustaría meterme con los componentes/configuraciones de la biblioteca hasta que me deshago del error, pero estoy cansado de encontrarme con esto, y quiero saber la forma correcta de resolver el problema. Por lo tanto, aquí hay algunas preguntas que tengo:

  • cuando se le requiere para añadir un componente a la biblioteca de un Fla en lugar de crear el componente de código?

  • ¿A qué Flas necesita agregar el componente? ¿Solo el que lo usa? ¿O todos los padres de esa Fla también?

  • Digamos que el componente Autocompletar requiere un componente ScrollPane. ¿Por qué no se reconoce esta dependencia cuando agrego el componente? ¿Por qué debo agregarlo explícitamente?

  • ¿Cuál es la diferencia entre agregar un componente a la biblioteca y agregarlo a la carpeta 'Componentes de componentes' de la biblioteca? ¿Cuál es el propósito de esta carpeta?

Realmente necesito este componente Autocompletar para funcionar. Suponiendo que el código AS3 es correcto y sigo recibiendo el error anterior, ¿qué ajustes crees que probablemente sean incorrectos? Por frustración, intenté agregar todos los componentes posibles a la biblioteca, así como a la carpeta de activos de componentes de la biblioteca solo para tener un punto de partida, pero sigo recibiendo el error.

Cualquier ayuda es apreciada.

Respuesta

2

No estoy seguro de que entienda que está configurado. Lo que supongo es que tiene un elemento secundario que contiene algunos componentes y que necesita crear instancias de esos componentes en un elemento principal (cargador) fla.

Debería funcionar si compila las clases del fla de child al fla padre, pero eso duplicaría las cosas.

El problema es cuando carga un swf, las clases se sientan en un ApplicationDomain diferente. En pocas palabras, eso es lo que gestiona las clases en un swf para que no haya colisiones de clase entre un cargador y el swf cargado y algunas otras cosas de seguridad.

Hice un fla simple que contiene un componente Button (fl.controls.Button) y lo cargó desde un cargador fla. No agregué el componente Button al cargador fla, pero creé una instancia de botón, usando el dominio de aplicación del swf cargado.Así es como:

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
loader.load(new URLRequest('componentContainer.swf')); 

function loaded(event:Event):void { 
    addChild(loader.content); 
    var SWFButton:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('fl.controls.Button') as Class; 
    var button = new SWFButton(); 
    button.label = 'Test'; 
    addChild(button); 
} 

Hay una página de Programación con ActionScript 3.0 sobre thise tipo de problemas y cómo utilizar ApplicationDomain, pero que no entendía totalmente que sea honesto.

HTH, George

Cuestiones relacionadas