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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     XML.onLoadをクラス内で記述すると上手く動かないのですが
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tiffin
Åê¹ÆNo.6836
投稿日時: 2004-5-3 16:24
新米
居住地: 神奈川
投稿: 13
使用環境:
7.0.1Win2k-Pro(SP4)
XML.onLoadをクラス内で記述すると上手く動かないのですが
下記のコードでXMLTESTをコールすると、XMLDOC.onLoadがonXMLLoadをコールして欲しいのですが、期待通りに動かず困っています。

このコードをタイムラインに(ちょっと修正して)記述したころ、問題なく動きました。

調べてみたところ、XMLDOC.onLoad内のtrace(this);では、XMLファイルの内容がそのまま出力されています。

アドバイス頂けますでしょうか。

class XMLLOAD {
	var XMLDOC:XML

	public function XMLTEST():Void{
		XMLDOC = new XML();
		XMLDOC.ignoreWhite = true;
		XMLDOC.onLoad = function(success:Boolean) {
			onXMLLoad(success); // parse the XML
			trace(this);
		}
		XMLDOC.load("test.xml");
	}

	private function onXMLLoad(success:Boolean):Void{
		if(success == true){
			trace("成功");
			var childNodesList:Array = XMLDOC.firstChild.childNodes;
			trace(childNodesList[0]);
		}else{
			trace("失敗");
		}
	}
}
pinkgear
Åê¹ÆNo.6837
投稿日時: 2004-5-3 17:48
半人前
居住地:
投稿: 35
使用環境:
Mac OS X 10.4.2, Studio MX 2004 w Flash MX Pro
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
ども。
#「期待通り」という部分は、コールされないという解釈でいいのか分かりませんが。
試してないのですが、これではどうでしょうか。
XMLDOC.onLoad = onXMLLoad;
野中文雄
Åê¹ÆNo.6838
投稿日時: 2004-5-3 19:35
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
コールバック関数のブロック内では、this関数を定義したインスタンスを参照します。
引用:
tiffinさんは書きました:
調べてみたところ、XMLDOC.onLoad内のtrace(this);では、XMLファイルの内容がそのまま出力されています。
...
class XMLLOAD {
	var XMLDOC:XML

	public function XMLTEST():Void{
		XMLDOC = new XML();
		XMLDOC.ignoreWhite = true;
		XMLDOC.onLoad = function(success:Boolean) {
			onXMLLoad(success); // parse the XML
			trace(this);
		}
		XMLDOC.load("test.xml");
	}


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

tiffin
Åê¹ÆNo.6907
投稿日時: 2004-5-6 10:51
新米
居住地: 神奈川
投稿: 13
使用環境:
7.0.1Win2k-Pro(SP4)
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
pinkgearさん、野中さん、アドバイス有難うございます。

thisは関数を定義したインスタンスが返ってくるのですね。勉強になりました。

期待通りに動かない原因は、XMLDOCをstatic宣言していなかったためのようです。(不思議ですが。)
princessMK
Åê¹ÆNo.7270
投稿日時: 2004-5-13 20:49
新米
居住地:
投稿: 1
使用環境:
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
//var childNodesList:Array = XMLDOC.firstChild.childNodes;

var childNodesList:Array
= this.valueOf().firstChild.childNodes;

のように書き換えたら、ノードにアクセスできるようになります。
野中文雄
Åê¹ÆNo.7273
投稿日時: 2004-5-13 21:52
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
ターゲットさえ正しく指定すれば、動作すると思います。
引用:
tiffinさんは書きました:
期待通りに動かない原因は、XMLDOCをstatic宣言していなかったためのようです。(不思議ですが。)

class XMLLOAD {
    var XMLDOC:XML;

    public function XMLTEST():Void {
        XMLDOC = new XML();
        XMLDOC.ignoreWhite = true;
        var owner = this;  //【追加】
        XMLDOC.onLoad = function(success:Boolean) {
            // onXMLLoad(success);  //【修正】
            owner.onXMLLoad(success);  // parse the XML
            // trace(this);
        };
        XMLDOC.load("test.xml");
    }

    private function onXMLLoad(success:Boolean):Void {
        if (success == true) {
            trace("成功");
            var childNodesList:Array = XMLDOC.firstChild.childNodes;
            trace(childNodesList[0]);
        } else {
            trace("失敗");
        }
    }
}

this.valueOf()は、thisと同値ではありませんか?
引用:
princessMKさんは書きました:
var childNodesList:Array 
                   = this.valueOf().firstChild.childNodes;
trace(this === this.valueOf());  // 出力: true

のように書き換えたら、ノードにアクセスできるようになります。


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

nao
Åê¹ÆNo.8706
投稿日時: 2004-6-29 2:54
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
すいません…いまさらながら便乗の質問していいでしょうか?
(新規で立てた方がよければ立て直します.)

可視性についての質問です.
先にある質問のコードを引用させていただきます.

class XMLLOAD {
    var XMLDOC:XML;

    public function XMLTEST():Void {
        XMLDOC = new XML();
        XMLDOC.ignoreWhite = true;
        var owner = this;  //【追加】
        XMLDOC.onLoad = function(success:Boolean) {
            // onXMLLoad(success);  //【修正】
            owner.onXMLLoad(success);  // parse the XML
            // trace(this);
        };
        XMLDOC.load("test.xml");
    }

    private function onXMLLoad(success:Boolean):Void {
        if (success == true) {
            trace("成功");
            var childNodesList:Array = XMLDOC.firstChild.childNodes;
            trace(childNodesList[0]);
        } else {
            trace("失敗");
        }
    }
}


上記のコードで[onXMLLoad()]が呼ばれるのは実際はXMLクラスのインスタンスですよね?

ActionScript2.0では[private]は同一クラス及びそのサブクラスから.
[public]はどこかれでもOK.

だとすると可視性を[private]でなくて[public]の方がいいのでは?
と思うんですがなぜ[private]としてもエラーではないのでしょうか?

よろしくお願いします.


----------------
nao [seto@graffiti-web.org]

野中文雄
Åê¹ÆNo.8710
投稿日時: 2004-6-29 4:10
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
XML.onLoadメソッドは、XMLインスタンスXMLDOCに定義されています。したがって、そのコールバック関数のブロック内はXMLインスタンスXMLDOCがthis参照となり、onXMLLoad()メソッドはそこから呼出されることになります。
引用:
Naoさんは書きました:
class XMLLOAD {
    var XMLDOC:XML;

    public function XMLTEST():Void {
        XMLDOC = new XML();
        XMLDOC.ignoreWhite = true;
        var owner = this;
        XMLDOC.onLoad = function(success:Boolean) {
            owner.onXMLLoad(success);
        };
        XMLDOC.load("test.xml");
    }

    private function onXMLLoad(success:Boolean):Void {
        // ...[中略]...
    }
}

上記のコードで[onXMLLoad()]が呼ばれるのは実際はXMLクラスのインスタンスですよね?

ActionScript 2.0のprivateキーワードの意味は、そのとおりです。
引用:
ActionScript2.0では[private]は同一クラス及びそのサブクラスから.
[public]はどこかれでもOK

よいご質問ですね。 ownerがローカル変数であることに、ご注目ください。

function(メソッド)内で名前のない関数を定義すると、その関数プロック内のスコープは外側のfunctionのものが保持されます。つまり、感覚的にいいますと、XML.onLoadメソッドのコールパック関数内でありながら、なおXMLTEST()メソッドのスコープ内といえるのです。

結果として、XMLTEST()メソッドからの呼出しということになりますので、クラスのprivateインスタンスメソッドであるonXMLLoad()を呼出すことができます。

ローカル変数に対するスコープは、「Activationオブジェクト」により管理されます。
引用:
だとすると可視性を[private]でなくて[public]の方がいいのでは?
と思うんですがなぜ[private]としてもエラーではないのでしょうか?


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

nao
Åê¹ÆNo.8737
投稿日時: 2004-6-30 1:26
職人
居住地:
投稿: 208
使用環境:
WinXP Pro
Flash8 Professional
Re: XML.onLoadをクラス内で記述すると上手く動かないのですが
野中さん毎度ありがとうございます.

XMLTEST()メソッドによって生成されたActivationObject越しに
onXMLLoadが呼ばれているのでそれはprivateでもいいということですね.

なんか分かったような気がします.


----------------
nao [seto@graffiti-web.org]

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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