2010-01-29 2 views
5

У меня была проблема, которая много раз мучила меня во время разработки Flash-проекта. Это выглядит примерно так:Каков правильный способ добавления компонентов в библиотеку 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() 

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

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

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

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

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

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

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

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

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

ответ

2

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

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

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

Я сделал простую fla, содержащую компонент Button (fl.controls.Button) и загруженный из флага загрузчика. Я не добавил компонент Button в flor загрузчика, но создал экземпляр кнопки, используя загруженный домен приложения 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 о Thise рода вопросы, и как использовать ApplicationDomain, но я до конца не понимал, что это будет честно.

HTH, George

Смежные вопросы