3.0問題[TLFテキスト]が含まれた外部SWFファイルを読込むと、その中にあるオブジェクトの参照が読込んだムービー側のタイムラインから得られないという問題です。外部ファイルとして読込ませるムービーのメインタイムラインに[TLFテキスト]を置いて、my_txtというインスタンス名をつけます(図001)。ファイル名はsub.flaとして、SWFファイルを書出しておきます。図001■外部ファイルとして読込むムービーのタイムラインに置いた[TLFテキスト]にインスタンス名をつける外部SWFファイルを読込むムービーファイルは、同じ階層に保存しておきます。メインタイムラインには、つぎのようなフレームアクションを書きます。外部SWFをLoaderクラスによりロードする、ごく標準的なスクリプトです(図002上図・中図)。ところが、[ムービープレビュー]を確かめると、[TLFテキスト](TLFTextField)インスタンスが見つからないというランタイムエラーが[出力]されます(図002下図)。インスタンスmy_txtが見つからない}図002■Loaderクラスで読込んだSWFのメインタイムラインにあるインスタンスが参照できない読込まれるsub.swfに置いた[TLFテキスト]を[クラシックテキスト](TextField)インスタンスに変えると、読込むフレームアクションはそのままで、インスタンスにアクセスできるようになります(図003)。読込まれるSWFファイルに[TLFテキスト]インスタンスが含まれていると、そのメインタイムラインとそれを読込んだLoaderインスタンスの間に他のインスタンスが加わるようです。読込まれるSWFのFLAファイルsub.flaのメインタイムラインに、つぎのようなフレームアクションを1行書き加えます。parent.parent.parent);読込むムービーのフレームアクションも、LoaderInfo.completeイベント(定数Event.COMPLETE)のリスナー関数からランタイムエラーになるステートメントはコメントアウトして、Loader.contentプロパティの参照を[出力]してみます。図004■Loader.contentプロパティの参照を[出力]する読込んだムービーのリスナー関数と、読込まれた外部SWFファイルのフレームアクションから、それぞれ1行ずつ[出力]が示されます。CS5と5.5では異なります。Frameworkコンポーネントライブラリのバージョンが違うからです[*1]。CS5では[出力]パネルにつぎのように表示されます。MainTimeline__Preloader__])ができあがっています。Loader.contentプロパティがロードしたSWFファイルのメインタイムラインを参照していませんので、プロパティからではメインタイムラインに配置したインスタンスにアクセスできないのです。CS5.5では[出力]パネルの表示はつぎのように変わります。MainTimeline__Preloader__])になっています。Loader])は間に入りません。いずれにしても、LoaderInfo.completeイベントが起こったときのLoader.contentプロパティはプリローダを参照していますので、プロパティから外部SWFのメインタイムラインにはアクセスできないということです。CS5と5.5でTLFテキストの初期化プロセスが異なることについては、「TLFテキストが配置されたメインタイムラインの初期化」をご参照ください。Frameworkを使う」をご参照ください。対処法Loaderインスタンスと読込まれるSWFファイルのメインタイムラインの間に入るインスタンスについては、Adobeの公式ドキュメントに説明が見当たらず、それらの生成のタイミングもはっきりしません。それでも、対応の仕方はいくつか考えられます[*2]。本稿では3つご紹介します。第1に、外部SWFの表示リストはTLFテキストを初期化する過程で動いても、読込むローダー側はそうした問題がありません[*3]。すると、読込まれるSWFファイルの側から、読込むムービーにメインタイムラインの参照を渡すことが考えられます。ローダー側ムービーのメインタイムラインに関数を定義して、外部SWFファイルはその関数の引数に自らのメインタイムラインの参照を渡します。外部SWFファイルを読込むムービーのフレームアクションには、つぎのスクリプト001のように、関数xSetContent()を加えました。この関数は、外部SWFファイルから呼出されて、そのメインタイムラインの参照を受取ります。"success";}つぎに、読込まれるSWFファィルのメインタイムラインにフレームアクションを書き加えます。Loaderインスタンスとの間につくられるインスタンスの情報が確かではありませんので、読込むロード側ムービーのタイムラインを相対参照することは避けます[*4]。特別の事情がないかぎり、ロード側ムービーのメインタイムラインは、Stageオブジェクトの最初の子です。したがって、DisplayObject.stageプロパティから、DisplayObjectContainer.getChildAt()メソッドで得られるでしょう(スクリプト002)。{callback(this);}この読込まれる外部SWFファイルを単独で書出すと、関数が定義されていない旨のランタイムエラーが示されます(図005)。このエラーは外部SWFファイルとしてロード側ムービーに読込めば解消されます。ロード側ムービーから[ムービープレビュー]を確かめれば、外部SWFファイルのメインタイムラインの参照が得られ、そこに置いたインスタンスにもアクセスできます。FrameworkのActionScriptライブラリをSWFファイルに埋込むことです。ファイルのパブリッシュ」参照)。対処法の第3として、SafeLoaderクラスを使うことが挙げられます。SafeLoaderクラスは、この問題に対処するためAdobeから無償で提供されています。そのインストール方法や使い方は、「SafeLoaderクラスを使う」に解説しましたので、お読みください。errors」は、エラーの生じる具体的な状況の説明はないものの、本稿と同じ問題を念頭においているものと思われます。この解説では、本文「対処法」の第2と第3を紹介しています。3.0の詳細設定]で[プリローダー方式]を[タイムラインのプリローダーループ]にして、カスタムプリローダをつくる方法も紹介しています。日本語の記事としては、2BLOG「ランタイム共有ライブラリのさらなるローディング方法」が参考になります。読込む側のムービーにもTLFテキストを置いた場合には、表示リストが組替えられてしまうので、問題が起きそうです。ローダー側ムービーのフレームアクションが実行されるのは、TLFテキストの初期化が済んだ後です。したがって、ほかに表示リストにおけるメインタイムラインの位置を動かしていなければ、[1]の処理に問題は生じません。CS5の[ムービープレビュー]で確かめると、読込まれたSWFファィルにはさらにDisplayObject.addedToStageイベント(定数Event.ADDED_TO_STAGE)が起こり、つぎのようにLoaderオブジェクトとの間に入るインスタンスの数はひとつに減ります(図006)。インスタンスの階層を確認}図006■読込まれる外部SWFファィルにDisplayObject.addedToStageイベントのリスナー関数を加えるなお、この動きはCS5.5では異なります。詳しくは前出「TLFテキストが配置されたメインタイムラインの初期化」の01「メインタイムラインはどこにいるのか」をご参照ください。CS5.5の情報や「SafeLoaderクラスを使う」へのリンクなどを追加。