どうも今晩は。プログラマTです。

 Flex で作成した SWF から外部の SWF を読み込み、その中のメソッドを呼んだりしたい事ってありますよね。普通に考えると、SWFLoader に addEventListener (Event.COMPLETE,[関数]); の様にしたいですが、実はこれでは不完全です。

 何故かと言うと、SWFLoader が COMPLETE したからと言って中の Application がしっかり初期化されているとは限らないためです。では、中の Application がしっかり初期化された後に何か処理を行いたい場合はどうすればいいか?

 ここで重要なのは COMPLETE した段階で、読み込んだ SWF の SystemManager は作成されているという所です。この SystemManager に addEventListener し、FlexEvent.APPLICATION_COMPLETE のタイプのイベントリスナーを登録します。例えば、下記の様にします。

private function swfReady (event:Event):void
{
        var sm:SystemManager = SystemManager (loader.content);
        sm.addEventListener (FlexEvent.APPLICATION_COMPLETE,applicationReady);
}

event 解説.png

 この場合、loader という SWFLoader があったとします。それが読み込み完了した段階で swfReady という関数が呼ばれます。この中でその SWF の SystemManager に対して APPLICATION_COMPLETE のイベントリスナーを登録しています。こうすると、実際にその Application が読み込み完了した段階で applicationReady という関数が呼ばれる事になります。

 こうすると、applicationReady の関数の中では、SystemManager の application プロパティーにインスタンスが代入されているのが確認できると思います。後はそれを自分の希望するクラスにキャストすればいいだけです。

 ややこしいのは、COMPLETE のイベントハンドラでも「たまに」動いてしまう事ですね。この辺は処理速度にもよるのだと思いますが、しっかりと初期化した後に処理を行いたい場合は、APPLICATION_COMPLETE の方を使いましょう。

 そうそう、書き忘れてしまいましたが、外部の SWF を読み込む時にはセキュリティの問題が付いてまわります。これは当然と言えば当然の事なのですが、すごく面倒です。特にローカルで動かす事を前提としている(SWF ファイルが file:// で表現できる所に置いてある)場合、特に面倒です。このあたりの事については、また今度書いてみようかと思います。



 株式会社ベビーユニバースでは、お客様のご要望に応じて受託開発を承っております。Adobe Illustrator, InDesign, Photoshop の各種プラグイン開発をはじめ、Web アプリケーション、動的 WEB ページ、スタンドアロンアプリケーションなど、各フィールドでのプロフェッショナルがお客様のご要望にお応えします。また、それらをマッシュアップしたシステムなどは、弊社の最も得意とするフィールドの一つです。

 「こんな開発できるのかな?」「こんなソフトが欲しいんだけど...」といったご質問は、システム開発などに関するお問い合わせよりお気軽にお問い合わせ下さい。

posted by Babyuniverse (2009年11月29日 20:22) | | コメント(0) | トラックバック(0)

トップへ戻る


Calendar

2011年7月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

最近のエントリー

etriy last line delete

BU-SER net ログイン

BU-SERnetについて

さらに詳しくみる

BU-SER net (ユーザーネットワーク) 内の検索は下記サーチボックスで行えます。

TKコンサルティング