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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     クラス間のデータのやり取りについて
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
balance
Åê¹ÆNo.33285
投稿日時: 2007-5-9 15:31
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
クラス間のデータのやり取りについて
毎回お世話になっています。

今回、クラス間のデータのやり取りで、つまづいてしまいました。

今回の目的は、指定したxmlノードのデータを
traceしようとすることです。

以下のxmlデータを読み込み、処理しようとしています。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<item>
	<image>sample.jpg</image>
</item>

クラスは2つ用意しています。

XMLを読み込むクラス
XMLLoader.as
class XMLLoader
{
	static function loadXML(parse:Function , callBack:Function )
	{
		var image_xml:XML = new XML();
		image_xml.ignoreWhite = true;
		
		image_xml.onLoad = function()
		{
			var data = parse( this );
			callBack( data ) ;
		}
		image_xml.load("xml/image.xml");
	}
}

先ほどのXMLLoaderクラスを使って指定したノードをtraceするクラス
Init.as
import XMLLoader;

class Init
{
	function Init()
	{
		XMLLoader.loadXML( parse , setData );
	}

	private function parse( xml:XML )
	{
		//指定したノードを返す。
		return xml.firstChild.childNodes;
	}

	private function setData( obj:Object ){
		//取得したノードをtraceする。
		trace( obj );		
	}
}

flaファイルの_root第一フレームには
var init_obj = new Init();


と書いてあります。
これでInitクラスを実行させ、XMLLoaderクラスから
データを取りにいっています。

これでも指定したノードのデータをtraceできますが、


次の例のように、


Init.as
import XMLLoader;

class Init
{
	function Init()
	{
		var data_obj = XMLLoader.loadXML( parse );
		trace(data_obj);			
	}

	private function parse( xml:XML )
	{
		//指定したノードを返す。
		return xml.firstChild.childNodes;
	}
}

とし、XMLLoader.loadXMLを実行するだけで
値を返してくれて、data_objに指定ノードを格納したいのです。
その為に、下記のようにXMLLoaderクラスを書き直しました。

XMLLoader.as
class XMLLoader
{
	static function loadXML(parse:Function )
	{
		var image_xml:XML = new XML();
		image_xml.ignoreWhite = true;
		
		var target:Object = this;
		var obj:Object;
		
		image_xml.onLoad = function()
		{
			target.obj = parse( this );
		}
		image_xml.load("xml/image.xml");
		return obj;
	}
}

しかし、これでは

---------------実行結果--------------------
このスコープから 'this' にアクセスできません。
var target:Object = this;
-------------------------------------------

このようにエラーが出てしまいます。
エラーがなくても、returnするタイミングが
おかしいかと思います。


どのようにすれば正しくreturnし、
Initクラスから
XMLLoader.loadXMLで呼び出し、
正しく値を返してくれるのでしょうか。

かなり長くなってしまいました。
よろしくお願いします。
nekoyuki
Åê¹ÆNo.33287
投稿日時: 2007-5-9 15:59
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: クラス間のデータのやり取りについて
一連の処理の流れでXMLのデータを読み込むのは不可能です。
データを読み込むまでその後の処理を待機させる方法をとって見たらどうでしょうか?

引用:

balanceさんは書きました:

XMLLoader.as
class XMLLoader
{
	static function loadXML(parse:Function )
	{
		var image_xml:XML = new XML();
		image_xml.ignoreWhite = true;
		

		var target:Object = this;//スタティックメソッドからthisを使うことは出来ません。
		var obj:Object;
		
		image_xml.onLoad = function()
		{
			target.obj = parse( this );//イベントハンドラメソッド内ではスコープが変わります。この中のthisはimage_xmlです。

		}
		image_xml.load("xml/image.xml");
		return obj;//image_xml.onLoadがコールバックされない限りこの変数objは空だと思われます。
	}
}



balance
Åê¹ÆNo.33288
投稿日時: 2007-5-9 17:57
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
Re: クラス間のデータのやり取りについて
nekoyukiさん

ありがとうございます。

>データを読み込むまでその後の処理を待機させる方法

thisが使えないとなると、staticなメソッドは止め、
読み込んだ後に処理を呼び出せばいいでしょうか。


class Init
{
	function Init()
	{
		var hoge = new XMLLoader();
		var data_obj:Object = hoge.loadXML( parse );
	}

	private function parse( xml:XML )
	{	
		return xml.firstChild.childNodes;
	}
}




このようにnew XMLLoader()で新しくインスタンスを作り、

class XMLLoader
{
	function loadXML(parse:Function )
	{
		var image_xml:XML = new XML();
		image_xml.ignoreWhite = true;
	
		var target = this;
		var obj;
		
		image_xml.onLoad = function()
		{
			var data:Object = parse( this );
			target.returnObj( data );
		}
		image_xml.load("xml/image.xml");
	}
	
	function returnObj( data:Object ){
		trace(data);
	}
}



XMLLoaderではもう一つ関数を作り、
そこでreturnすればいいのでしょうか。
(上に上げた例ではtraceしている)
ここでどのようにreturnすれば、XMLLoaderをnewした箇所に
値が返るかが分かりません。


一つ言い忘れました。
最初の投稿で書いた最初の例(callBackメソッドで値を取る方法)は、
書籍Flash OOPの『MovieClipベースか、classベースでスクリプトを組むか』
という項を参考にしたものです。
(今、手元に本がないので、詳しい名前、ページは分かりません。すみません。)

Flash OOPの本では前者のように値を取得していましたが、
後者のようにXMLLoaderをnewしただけで値を取得できるように
したいと考えました。

よろしくお願いします。
野中文雄
Åê¹ÆNo.33291
投稿日時: 2007-5-9 21:00
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: クラス間のデータのやり取りについて
今不在の相手に電話して、問合せの回答を得るためには、折返しの連絡先を伝言して、その返事を待たなければなりません。その連絡先が、もとのXMLLoader.loadXML()メソッドに渡した引数callBackです。

balanceさんのやられようとしていることは、不在相手に電話したそのときに、何とかして回答を得たいというものです。つまり、無理です。電話を受けた窓口のXMLLoaderは、いくら金を積まれようが、その時点で返せる情報はありません。
引用:
balanceさんは書きました:
XMLLoaderではもう一つ関数を作り、
そこでreturnすればいいのでしょうか。
(上に上げた例ではtraceしている)

XMLLoaderクラスは静的なメソッドしかもちませんので、「new」していないですよね。flaファイルのフレームアクションでnew Int()を呼出している部分のことだと解釈しましたけど。
引用:
ここでどのようにreturnすれば、XMLLoaderをnewした箇所に
値が返るかが分かりません。

指定ノードをtrace()するだけのことは、可能です。ですから、離席した相手が戻ったとき、誰かに回答を伝えるように処理すること自体はできるはずです。なぜ連絡先(callBack)を教えたくないのか、その代替として何か別の相手を考えなければならないでしょう。
class XMLLoader {
	private function XMLLoader() {
	}
	static function loadXML(parse:Function) {
		var image_xml:XML = new XML();
		image_xml.ignoreWhite = true;
		// var target:Object = this;
		var obj:Object;
		image_xml.onLoad = function() {  // 回答者が自席に戻ったら
			// target.obj = parse(this);
			obj = parse(image_xml);
			trace(obj);  // この回答を誰に伝えたらいい?
		};
		image_xml.load("xml/image.xml");
		// return obj;
	}
}

まいどありがとうございます。CHAPTER 13「Flashのコーディング手法」のp.397以下ですね。
引用:
最初の投稿で書いた最初の例(callBackメソッドで値を取る方法)は、
書籍Flash OOPの『MovieClipベースか、classベースでスクリプトを組むか』
という項を参考にしたものです。
(今、手元に本がないので、詳しい名前、ページは分かりません。すみません。)


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

balance
Åê¹ÆNo.33305
投稿日時: 2007-5-11 15:41
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
Re: クラス間のデータのやり取りについて
野中さん

ありがとうございます。

意味が分かりました。
引数callBackは、例えば、MovieClipLoaderクラスの
onLoadCompleteやonLoadProgressのような役目なのですね。

ひとつお聞きしたいのですが、
引用:
XMLLoaderクラスは静的なメソッドしかもちませんので、「new」していないですよね。

var hoge = new XMLLoader();
これでは、今回の場合、newした事にはならないのでしょうか。

引用:
まいどありがとうございます。CHAPTER 13「Flashのコーディング手法」のp.397以下ですね。


そうです。今勉強させてもらっています!

また助けて頂いてありがとうございます!
ひろゆき
Åê¹ÆNo.33311
投稿日時: 2007-5-11 16:50
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: クラス間のデータのやり取りについて
引用:
balanceさんは書きました:
var hoge = new XMLLoader();
これでは、今回の場合、newした事にはならないのでしょうか。

コンストラクタがないからではないでしょうか?


----------------
質問する際は、回答者に具体的な情報を与えてください。

balance
Åê¹ÆNo.33317
投稿日時: 2007-5-11 18:19
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
Re: クラス間のデータのやり取りについて
ひろゆきさん

コンストラクタで何か処理をしないと、
『newする』とは言わないのですね。

何も処理がなくても言うものだと思っていました。
ありがとうございます!
野中文雄
Åê¹ÆNo.33319
投稿日時: 2007-5-14 0:21
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: クラス間のデータのやり取りについて
失礼しました。最初に投稿されたクラスを見ていました。

ただ、XMLLoaderインスタンスをプロパティに保持せず、メソッドを呼出すだけですので、静的メソッドから変更する意味はとくにないように思われます。
引用:
balanceさんは書きました:
ひとつお聞きしたいのですが、
引用:
XMLLoaderクラスは静的なメソッドしかもちませんので、「new」していないですよね。

var hoge = new XMLLoader();
これでは、今回の場合、newした事にはならないのでしょうか。


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

balance
Åê¹ÆNo.33320
投稿日時: 2007-5-14 19:06
半人前
居住地:
投稿: 31
使用環境:
win XP , Flash8
Re: クラス間のデータのやり取りについて
野中さん

いえいえ、有難うございます。
今回も勉強させて頂きました!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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