Macromedia Flash非公式テクニカルノート TLFテキストのある外部SWFを読込むとその中のオブジェクトにアクセスできない
問題 たとえば、外部ファイルとして読込ませるムービーのメインタイムラインに[TLFテキスト]を置いて、my_txtというインスタンス名をつけます(図001)。ファイル名はsub.flaとして、SWFファイルを書出しておきます。 図001■外部ファイルとして読込むムービーのタイムラインに置いた[TLFテキスト]にインスタンス名をつける外部SWFファイルを読込むムービーファイルは、同じ階層に保存しておきます。メインタイムラインには、つぎのようなフレームアクションを書きます。外部SWFをLoaderクラスによりロードする、ごく標準的なスクリプトです(図002上図・中図)。ところが、[ムービープレビュー]を確かめると、[TLFテキスト](TLFTextField)インスタンスが見つからないというランタイムエラーが[出力]されます(図002下図)。
図002■Loaderクラスで読込んだSWFのメインタイムラインにあるインスタンスが参照できない 読込まれるsub.swfに置いた[TLFテキスト]を[クラシックテキスト](TextField)インスタンスに変えると、読込むフレームアクションはそのままで、インスタンスにアクセスできるようになります(図003)。 図003■[TLFテキスト]インスタンスを[クラシックテキスト]に変えると参照できる原因
読込むムービーのフレームアクションも、LoaderInfo.completeイベント(定数Event.COMPLETE)のリスナー関数からランタイムエラーになるステートメントはコメントアウトして、Loader.contentプロパティの参照を[出力]してみます。 図004■Loader.contentプロパティの参照を[出力]する 読込んだムービーのリスナー関数と、読込まれた外部SWFファイルのフレームアクションから、それぞれ1行ずつ[出力]が示されます。その内容は、Flash Professional CS5と5.5では異なります。備わっているText Layout Frameworkコンポーネントライブラリのバージョンが違うからです[*1]。 ●Flash Professional CS5の場合 complete [object MainTimeline__Preloader__] つまり、読込んだLoaderインスタンス([object Loader])と読込まれた外部SWFファイルのメインタイムライン([object MainTimeline])の間に、ふたつのインスタンス([object Loader]と[object MainTimeline__Preloader__])ができあがっています。Loader.contentプロパティがロードしたSWFファイルのメインタイムラインを参照していませんので、プロパティからではメインタイムラインに配置したインスタンスにアクセスできないのです。 ●Flash Professional CS5.5の場合 complete [object MainTimeline__Preloader__] 1行目はCS5と同じで、Loader.contentプロパティの参照がプリローダのインスタンス([object MainTimeline__Preloader__])になっています。けれど、2行目はCS5と違って、外部SWFのメインタイムラインはプリローダの直接の子で、別のLoaderインスタンス([object Loader])は間に入りません。 いずれにしても、LoaderInfo.completeイベントが起こったときのLoader.contentプロパティはプリローダを参照していますので、プロパティから外部SWFのメインタイムラインにはアクセスできないということです。なお、Flash Professional CS5と5.5でTLFテキストの初期化プロセスが異なることについては、「TLFテキストが配置されたメインタイムラインの初期化」をご参照ください。
対処法 第1に、外部SWFの表示リストはTLFテキストを初期化する過程で動いても、読込むローダー側はそうした問題がありません[*3]。すると、読込まれるSWFファイルの側から、読込むムービーにメインタイムラインの参照を渡すことが考えられます。つまり、ローダー側ムービーのメインタイムラインに関数を定義して、外部SWFファイルはその関数の引数に自らのメインタイムラインの参照を渡します。 外部SWFファイルを読込むムービーのフレームアクションには、つぎのスクリプト001のように、関数xSetContent()を加えました。この関数は、外部SWFファイルから呼出されて、そのメインタイムラインの参照を受取ります。 スクリプト001■外部SWFから呼出されてメインタイムラインの参照を受取る関数追加
つぎに、読込まれるSWFファィルのメインタイムラインにフレームアクションを書き加えます。Loaderインスタンスとの間につくられるインスタンスの情報が確かではありませんので、読込むロード側ムービーのタイムラインを相対参照することは避けます[*4]。特別の事情がないかぎり、ロード側ムービーのメインタイムラインは、Stageオブジェクトの最初の子です。したがって、DisplayObject.stageプロパティから、DisplayObjectContainer.getChildAt()メソッドで得られるでしょう(スクリプト002)。 スクリプト002■外部SWFファィルのメインタイムラインからロード側ムービーの関数を呼出す
この読込まれる外部SWFファイルを単独で書出すと、関数が定義されていない旨のランタイムエラーが示されます(図005)。しかし、このエラーは外部SWFファイルとしてロード側ムービーに読込めば解消されます。ロード側ムービーから[ムービープレビュー]を確かめれば、外部SWFファイルのメインタイムラインの参照が得られ、そこに置いたインスタンスにもアクセスできます。 図005■読込まれる外部SWFファィルを単独で書出すとランタイムエラーが示される 対処法の第2は、Text Layout FrameworkのActionScriptライブラリをSWFファイルに埋込むことです。具立て的な手順は、「TLFテキストが配置されたメインタイムラインの初期化」の04「[TLFテキスト]のActionScriptライブラリをSWFに埋込む」をお読みください(なお、「TLF テキストを含む SWF ファイルのパブリッシュ」参照)。 対処法の第3として、SafeLoaderクラスを使うことが挙げられます。SafeLoaderクラスは、この問題に対処するためAdobeから無償で提供されています。そのインストール方法や使い方は、「SafeLoaderクラスを使う」に解説しましたので、お読みください。
作成者: 野中文雄 Copyright © 2001-2012 Fumio Nonaka. All rights reserved. |
||||||||||||||||||