Как правильно добавить компоненты в библиотеку Swf? - PullRequest
5 голосов
/ 29 января 2010

У меня была проблема, которая много раз мучала меня в процессе разработки Flash-проекта. Это выглядит примерно так:

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() 

Теперь, в моем случае, эта ошибка возникает из-за инициализации компонентов в коде, когда они не были явно добавлены в библиотеку компонентов fla в CS4. В прошлом я сталкивался с этой проблемой при попытке динамически создавать ScrollPanes в коде. Я решил это, добавив компоненты ScrollPane в библиотеку моего Main.fla. Казалось, это работает некоторое время.

Теперь я пытаюсь использовать окно автозаполнения AstraFlash. Я импортировал соответствующие файлы fla в CS4 и поместил поле автозаполнения в свой Swf. Все строит нормально, но вышеуказанная ошибка возникает при загрузке Swf. Я думаю, что окно автозаполнения пытается создать ScrollPane как часть его функциональности. Хорошо, я понимаю это, поэтому я также добавляю компонент ScrollPane в библиотеку с теми же результатами.

Обычно я просто связывался с компонентами / настройками библиотеки, пока не избавился от ошибки, но мне надоело сталкиваться с этим, и я хочу знать правильный способ решения проблемы. Итак, вот несколько вопросов, которые у меня есть:

  • Когда вам нужно добавить компонент в библиотеку Fla, а не просто создать компонент в коде?

  • К какой Flas нужно добавить компонент? Только тот, кто его использует? Или все родители этого Фла?

  • Допустим, для компонента автозаполнения требуется компонент ScrollPane. Почему эта зависимость не распознается, когда я добавляю один компонент? Почему я должен явно добавить его?

  • В чем разница между добавлением компонента в библиотеку и добавлением его в папку «Component Assets» библиотеки? Какова цель этой папки?

Мне действительно нужен этот компонент автозаполнения для работы. Если предположить, что код AS3 правильный, а я все еще получаю вышеуказанную ошибку, какие настройки, по вашему мнению, являются неправильными? Из-за разочарования я попытался добавить каждый возможный компонент в библиотеку, а также в папку ресурсов библиотеки, чтобы получить отправную точку, но я все еще получаю сообщение об ошибке.

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 17 февраля 2010

Я не уверен, что понимаю, что вы настроены. Я предполагаю, что у вас есть дочерний fla, который содержит некоторые компоненты, и вам нужно создать экземпляры этих компонентов в родительском (загрузчике) fla.

Это должно сработать, если вы скомпилируете классы из дочернего fla в родительский fla, но это дублирует вещи.

Проблема в том, что при загрузке SWF классы располагаются в другом ApplicationDomain . Проще говоря, это то, что управляет классами в SWF, чтобы у вас не было коллизий классов между загрузчиком и загруженным SWF и некоторыми другими средствами безопасности.

Я сделал простой fla, который содержит компонент Button (fl.controls.Button) и загрузил его из fla загрузчика. Я не добавил компонент Button во флаг загрузчика, но создал экземпляр кнопки, используя домен приложения загруженного SWF. Вот как это сделать:

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

В Программировании ActionScript 3.0 есть страница о таких проблемах и о том, как использовать ApplicationDomain, но я не совсем понял, если честно.

НТН, George

...