2010-01-29 5 views
5

J'ai eu un problème qui m'a tourmenté plusieurs fois au cours du développement d'un projet Flash. Il ressemble à ceci:Quelle est la bonne façon d'ajouter des composants à la bibliothèque d'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() 

Maintenant, dans mon cas, cette erreur provient de l'initialisation des composants dans le code quand ils n'ont pas été explicitement ajouté à la bibliothèque de composants du fla dans CS4. Dans le passé, j'ai rencontré ce problème en essayant de créer dynamiquement ScrollPanes dans le code. Je l'ai résolu en ajoutant des composants ScrollPane à ma bibliothèque Main.fla. Cela a semblé fonctionner pendant un moment. Maintenant, j'essaie d'utiliser une boîte de saisie semi-automatique AstraFlash. J'ai importé les fichiers FLA appropriés dans CS4, et placé une boîte AutoComplete dans mon swf. Tout se construit bien, mais l'erreur ci-dessus se produit lorsque le swf est chargé. Ma pensée est que la boîte de saisie semi-automatique tente de créer un ScrollPane dans le cadre de ses fonctionnalités. Ok, je comprends cela, donc j'ajoute le composant ScrollPane à la bibliothèque avec les mêmes résultats.

Habituellement, je voudrais juste jouer avec les composants de la bibliothèque/paramètres jusqu'à ce que je me débarrasse de l'erreur, mais je suis malade de courir dans ce domaine, et je veux savoir la bonne façon de résoudre le problème. Alors, voici quelques questions que j'ai:

  • Quand Devez-vous ajouter un composant à une bibliothèque de Floride plutôt que la création du composant dans le code?

  • De quels flas avez-vous besoin pour ajouter le composant? Juste celui qui l'utilise? Ou tous les parents de cette Fla aussi?

  • Supposons que le composant de saisie semi-automatique nécessite un composant ScrollPane. Pourquoi cette dépendance n'est-elle pas reconnue lorsque j'ajoute un composant? Pourquoi dois-je l'ajouter explicitement?

  • Quelle est la différence entre l'ajout d'un composant à la bibliothèque et son ajout au dossier 'Component Assets' de la bibliothèque? Quel est le but de ce dossier?

J'ai vraiment besoin de ce composant de saisie semi-automatique pour fonctionner. En supposant que le code AS3 est correct, et je reçois toujours l'erreur ci-dessus, quels paramètres pensez-vous sont probablement incorrects? Par frustration, j'ai essayé d'ajouter tous les composants possibles dans la bibliothèque, ainsi que dans le dossier des composants de la bibliothèque, juste pour avoir un point de départ, mais j'ai toujours l'erreur.

Toute aide est appréciée.

Répondre

2

Je ne suis pas sûr de comprendre que vous êtes configuré. Ce que je suppose, c'est que vous avez un fla enfant qui contient des composants et que vous devez créer des instances de ces composants dans un fla parent (loader).

Cela devrait fonctionner si vous compilez les classes de la classe enfant dans la classe parent, mais cela dupliquerait les choses.

Le problème est que lorsque vous chargez un swf, les classes se trouvent dans un autre ApplicationDomain. En termes simples, c'est la chose qui gère les classes dans un swf afin que vous n'ayez pas de collisions de classes entre un chargeur et un swf chargé et d'autres éléments de sécurité.

J'ai fait un fla simple qui contient un composant Button (fl.controls.Button) et chargé celui d'un loader fla. Je n'ai pas ajouté le composant Button au fla loader, mais j'ai créé une instance de bouton, en utilisant le domaine d'application du swf chargé.Voici comment:

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); 
} 

Il y a une page dans la programmation Actionscript 3.0 sur les Thise genre de problèmes et comment utiliser ApplicationDomain, mais je ne comprenais pas tout à être honnête.

HTH, George

Questions connexes