トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     ApplicationDomainにより別なswf内のクラスを使いたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
たつや
Åê¹ÆNo.35048
投稿日時: 2007-9-11 14:24
新米
居住地: 大阪
投稿: 5
使用環境:
WinXP
Flash MX2004
Flex SDK
ApplicationDomainにより別なswf内のクラスを使いたい
いつもお世話になります。早速ですが、、、

メインとなるswfファイル(メイン側)と同じフォルダにある別なswfファイル(サブ側)としたクラスを使いたいと思い、調べたところApplicationDomainクラスでできそうと思ったのですが、行き詰っており質問させて頂きました。

swfファイル作成時にはメイン側、サブ側ともエラーは出ないのですが、実行時に、
ReferenceError: Error #1065: 変数 Greeter は定義されていません。
	at flash.system::ApplicationDomain/getDefinition()
	at MethodInfo-1()

というエラーが出ます(Firefox)。


メイン側の function completeHandler 内の最初のtrace文は処理されてますので、サブ側のswfは読み込めてるのかと思うのですが、、、
何かわかりましたらアドバイスよろしくお願い致します。


以下に関連部分のスクリプトを示します。
Adobe Flex2リファレンスガイドの例などより作成したものです。

メイン側(test.as)の一部分

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("testadc.swf");
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
loader.load(request , context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void {
	trace("complete!");//←実行時処理されます
	var greeterClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Greeter") as Class;
	var greeter:Object = new greeterClassRef();
	trace(greeter.greet());
}



サブ側(testadc.as)全て

package {
	import flash.display.Sprite;
	
	public class testadc extends Sprite {
		public function testadc(){
		}
	}
}

import flash.display.Sprite;
import flash.text.TextField;

class Greeter {
  private var greeting:String;
  
  public function Greeter() {
	  greeting = "Hello World";
   }
   
  public function greet():String {
	  return greeting;
   }
}

ニノミヤ カズノリ
Åê¹ÆNo.35050
投稿日時: 2007-9-11 16:43
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: ApplicationDomainにより別なswf内のクラスを使いたい
引用:
サブ側(testadc.as)全て

package {
	import flash.display.Sprite;
	
	public class testadc extends Sprite {
		public function testadc(){
		}
	}
}

import flash.display.Sprite;
import flash.text.TextField;

class Greeter {
  private var greeting:String;
  
  public function Greeter() {
	  greeting = "Hello World";
   }
   
  public function greet():String {
	  return greeting;
   }
}

これだとGreeterクラスはprivateになってしまいますよね。
privateだとこのクラスファイル内でしか使用できないので、外側から実行しようとしてもエラーが発生するんじゃないでしょうか。
ですので、Greeterクラスを分けて作った方が良いかと思います。

メイン側はそのままで、
testadc.as
package {
    import flash.display.Sprite;
    
    public class testadc extends Sprite {
        var test:Greeter;
        public function testadc(){
        }
    }
}


Greeter.as
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    
    public class Greeter {
        private var greeting:String;
        
        public function Greeter() {
            greeting = "Hello World";
         }
    
        public function greet():String {
            return greeting;
        }
    }
}

この場合、正しく"Hello World"が表示されました。
野中文雄
Åê¹ÆNo.35051
投稿日時: 2007-9-11 16:52
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ApplicationDomainにより別なswf内のクラスを使いたい
クラスGreeterがpackage化されていないからではありませんか? packageに入れない理由が何かあるのでしたら、クラスtestadcから呼出すべきでしょう。
引用:
たつやさんは書きました:
メインとなるswfファイル(メイン側)と同じフォルダにある別なswfファイル(サブ側)としたクラスを使いたいと思い、調べたところApplicationDomainクラスでできそうと思ったのですが、行き詰っており質問させて頂きました。

// SWF: メインflaドキュメントファイル
// フレームアクション
var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("testadc.swf");
var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;
loader.load(request , context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);

function completeHandler(event:Event):void {
	trace("complete!");  //←実行時処理されます
	// var greeterClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Greeter") as Class;
	var greeterClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("testadc") as Class;
	var greeter:Object = new greeterClassRef();
	trace(greeter.greet());
}

// ActionScript 3.0クラス定義ファイル: testadc.as
package {
	import flash.display.Sprite;

	public class testadc extends Sprite {
		var myGreeter:Greeter;
		public function testadc() {
			myGreeter = new Greeter();
		}
		public function greet():String {
			var my_str:String = myGreeter.greet();
			return my_str;
		}
	}
}

import flash.display.Sprite;
import flash.text.TextField;

class Greeter {
	private var greeting:String;

	public function Greeter() {
		greeting = "Hello World";
	}
	public function greet():String {
		return greeting;
	}
}


----------------
 

たつや
Åê¹ÆNo.35073
投稿日時: 2007-9-12 9:49
新米
居住地: 大阪
投稿: 5
使用環境:
WinXP
Flash MX2004
Flex SDK
Re: ApplicationDomainにより別なswf内のクラスを使いたい
ニノミヤ様、野中様、早速の回答ありがとうございました。

どちらも、コンパイル時に、

警告:var 'xxx'がデフォルトの名前空間にスコープされます:内部 testadc:。このパッケージの外部には表示されません。

というような警告は出ますが、期待通りの動作を確認することができました。
教えて頂いたスクリプトを見ると、自分のでは確かにGreeterクラスにアクセスできないな、と理解できました。
大変勉強になりました。ありがとうございました!


なお、クラスGreeterがpackage内にないのは、Adobe Flex 2 リファレンスガイドの ApplicationDomainクラスにある例を参考にしたためでした。
このような書き方をするのか?、と深く考えませんでした、、、
なるほど、リファレンスの例のスクリプトをコピペしたのさえ動かなかったわけだ

リファレンスガイドにある例
ニノミヤ カズノリ
Åê¹ÆNo.35075
投稿日時: 2007-9-12 11:05
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: ApplicationDomainにより別なswf内のクラスを使いたい
引用:
警告:var 'xxx'がデフォルトの名前空間にスコープされます:内部 testadc:。このパッケージの外部には表示されません。

失礼しました。
Flex2SDKの方では警告が出ていたのですね。
お気になる様でしたら、警告されている変数の前にpublicやprivate等を指定して下さい。
たつや
Åê¹ÆNo.35095
投稿日時: 2007-9-13 9:51
新米
居住地: 大阪
投稿: 5
使用環境:
WinXP
Flash MX2004
Flex SDK
Re: ApplicationDomainにより別なswf内のクラスを使いたい
なるほど!
どちらでも警告は出ず、動作もしました。
ありがとうございました!!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops