5

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

さて、私の場合、このエラーは、CS4のflaのコンポーネントライブラリにコンポーネントが明示的に追加されていないときに、コードでコンポーネントを初期化することに起因します。過去に、コードでScrollPanesを動的に作成しようとしたときに、この問題が発生しました。Main.flaのライブラリにScrollPaneコンポーネントを追加することで、これを解決しました。これはしばらくの間はうまくいったようです。

現在、AstraFlashオートコンプリートボックスを使用しようとしています。適切なflaファイルをCS4にインポートし、オートコンプリートボックスをSwfに配置しました。すべてが正常に構築されますが、Swfがロードされると上記のエラーが発生します。私の考えでは、オートコンプリートボックスは、その機能の一部としてScrollPaneを作成しようとしています。わかりました。これを理解したので、ScrollPaneコンポーネントもライブラリに追加すると、同じ結果になります。

通常、エラーを取り除くまでライブラリのコンポーネント/設定をいじりますが、これに遭遇するのはうんざりで、問題を解決する正しい方法を知りたいです。だから、ここに私が持っているいくつかの質問があります:

  • コードでコンポーネントを作成するだけでなく、Flaのライブラリにコンポーネントを追加する必要があるのはいつですか?

  • コンポーネントを追加する必要があるFlasはどれですか?それを使っているのは?それともそのFlaの親全員も?

  • オートコンプリートコンポーネントにScrollPaneコンポーネントが必要だとします。1つのコンポーネントを追加すると、この依存関係が認識されないのはなぜですか?なぜ明示的に追加する必要があるのですか?

  • ライブラリにコンポーネントを追加することと、ライブラリの「コンポーネントアセット」フォルダにコンポーネントを追加することの違いは何ですか?このフォルダの目的は何ですか?

このオートコンプリートコンポーネントが機能する必要があります。AS3コードが正しく、それでも上記のエラーが発生すると仮定すると、どの設定がおそらく間違っていると思いますか?欲求不満から、開始点として、ライブラリとライブラリのコンポーネントアセットフォルダにすべての可能なコンポーネントを追加しようとしましたが、それでもエラーが発生します。

どんな助けでも大歓迎です。

4

1 に答える 1

2

あなたがセットアップしていることを理解できません。私が想定しているのは、いくつかのコンポーネントを含む子flaがあり、それらのコンポーネントのインスタンスを親(ローダー)flaに作成する必要があるということです。

子flaから親flaにクラスをコンパイルすると機能するはずですが、それでは物事が重複します。

問題は、swfをロードすると、クラスが別のApplicationDomainに配置されることです。簡単に言えば、これはswf内のクラスを管理するものであるため、ローダーとロードされたswfおよびその他のセキュリティ関連のものとの間でクラスの衝突が発生することはありません。

Buttonコンポーネント(fl.controls.Button)を保持する単純なflaを作成し、ローダーflaからロードしました。Buttonコンポーネントをローダーflaに追加しませんでしたが、ロードされた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);
}

この種の問題とApplicationDomainの使用方法については、Programming Actionscript 3.0にページがありますが、正直に言うと完全には理解していませんでした。

HTH、ジョージ

于 2010-02-17T00:09:08.117 に答える