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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     外部テキストファイルの内容を変数に入れたいのですが…
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nish11
Åê¹ÆNo.44361
投稿日時: 2010-2-3 23:48
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS3
外部テキストファイルの内容を変数に入れたいのですが…
はじめて投稿させて頂きます。CS3、AS3.0で質問させて下さい。
やりたいことは「外部テキストファイルの中身を変数に入れる」という処理です。
(PHPのfile_get_contents関数のようなイメージです)

↓作ってみたクラス↓
package{

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;

/**
* 外部ファイル読み込みクラス。
*
* @auther
* @version 1.0
*/
public class loadFileData
{
public var contents:String; // ファイル内容

/**
* コンストラクタ
* @param (無し)
* @return (無し)
*/
public function loadFileData(){
this.contents = "初期化";
};

/**
* テキストファイル読み込み
* @param String
* @return Boolean
*/
public function getContentsAsText(path:String):Boolean{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest(path);

loader.addEventListener(Event.COMPLETE, loadData);
function loadData(event:Event){
this.contents = loader.data;
trace("this_1:"+ this); // 結果→this_1:[object global]
}
loader.load(request);

trace("this_2:"+ this); // 結果→this_2:[object loadFileData]
return true;
}

public function getContents():String{
return this.contents;
}
};
};

↓呼び元はこんな感じで考えてます↓
var lfData:loadFileData = new loadFileData();
var r:Boolean = lfData.getContentsAsText("test.txt");
var disp_message:String = lfData.getContents();

「this.contents = loader.data;」のところでファイルの中身を入れようと
しているのですが、上手く入ってくれません。
traceでthisがfunction loadData()の内外で違うものを指していることは分かって
クロージャ関連も調べてみたのですが、具体的な対応が分からずにいます。
(traceしたりダイナミックテキストに入れる方法はたくさん見つかるのですが…)

どうやればうまくいきますでしょうか。
参考URLでも大変助かりますので、何卒よろしくお願い致します。
野中文雄
Åê¹ÆNo.44362
投稿日時: 2010-2-4 2:15
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 外部テキストファイルの内容を変数に入れたいのですが…
「ダイナミックテキストに入れる」ことは、おできになるということですか?でしたら、「変数に入れる」ことは一旦脇に置いて、「ダイナミックテキストに入れる」スクリプトをお示しください。
引用:
nish11さんは書きました:
(traceしたりダイナミックテキストに入れる方法はたくさん見つかるのですが…)


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

nish11
Åê¹ÆNo.44363
投稿日時: 2010-2-4 8:36
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS3
Re: 外部テキストファイルの内容を変数に入れたいのですが…
野中文雄様

ご返信ありがとうございます。

クラスで書く前にフレーム上で書いていたのですが、
そのときは例えばダイナミックテキストを
「testTextField」という名前で作り、
testTextField.text = loader.data;
とすれば表示することができました。

クラスとして書いた後は試していませんでした。
(試しにやってみたところ、クラス内からstageを直接参照できないようで…)
言葉が足らず申し訳ございません。


引用:

Fumioさんは書きました:
「ダイナミックテキストに入れる」ことは、おできになるということですか?でしたら、「変数に入れる」ことは一旦脇に置いて、「ダイナミックテキストに入れる」スクリプトをお示しください。
野中文雄
Åê¹ÆNo.44364
投稿日時: 2010-2-4 14:40
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 外部テキストファイルの内容を変数に入れたいのですが…
おそらく「フレーム上で書いて」いれば、「変数に入れる」ことも可能だと思われます。だとすれば今回の問題は、「変数」か「ダイナミックテキスト」かではなく、クラス定義の構成です。
引用:
nish11さんは書きました:
クラスで書く前にフレーム上で書いていたのですが、
そのときは例えばダイナミックテキストを
「testTextField」という名前で作り、
testTextField.text = loader.data;
とすれば表示することができました。

すると、「参考URL」は「たくさん見つかる」のではありませんか?「変数」にこだわらず、「ダイナミックテキスト」であっても、それらの「参考URL」でカスタムクラスのインスタンスがプロパティ(TextFieldインスタンス)をどう参照しているのか研究するべきでしょう。
引用:
(traceしたりダイナミックテキストに入れる方法はたくさん見つかるのですが…)

大切なのは、問題を切分けることです。胃を調べるときは、まず空腹にしなければなりません。余分なものが入っていたために、問題が「変数」なのか「クラスの構成」なのか見えなくなっていたのではないでしょうか。

参考:「関数クロージャ内のthis参照について」「関数クロージャのthis参照について
package {
	// ...[中略]...
	import flash.events.Event;
	/**
	* 外部ファイル読み込みクラス。
	*
	* @auther 
	* @version 1.0
	*/
	public class loadFileData {
		/*
		...[中略]...
		*/
		public function loadFileData() {
			// this.contents = "初期化";
			getContentsAsText(null);
		}
		public function getContentsAsText(path:String):Boolean {
			/*
			...[中略]...
			*/
			function loadData(event:Event) {
				// this.contents = loader.data;
				trace("this_1:" + this);  // 結果→this_1:[object global]
			}
			// loader.load(request);
			trace("this_2:" + this);  // 結果→this_2:[object loadFileData]
			loadData(null);
			trace(loadData);
			test(loadData);
			return true;
		}
		/*
		...[中略]...
		*/
		public function test(func:Function):void {
			trace(func);
			trace(loadData);  // エラー発生の理由と意味を考える
		}
	}
}


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

nish11
Åê¹ÆNo.44368
投稿日時: 2010-2-4 23:03
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS3
Re: 外部テキストファイルの内容を変数に入れたいのですが…
野中文雄様

度々のご回答、並びにご指摘ありがとうございます。
その後色々試してみまして、ようやく原因が分かりました。

"this"の向き先に関しては、突き詰めれば本件と直接関係
ありませんでしたので、今後の課題とさせて頂きます。

「読み込んだデータが変数に入らない」という件が問題
だったのですが、これがそもそも勘違いでして、
変数にはきちんと入っておりました。
当初、traceを使ってloadData()メソッドの内外で変数の値を
確認していたのですが、変数の代入前後を取り違えておりました。
ここで「変数に読み込んだデータを代入→変数の値が初期値に戻る」
という錯覚を起こしてしまいました。

さらにその後、(詳しくは割愛させて頂きますが)取得した変数を
用いてMovieClipを作成、それに対してENTER_FRAMEで処理を進めたところ、
テキストファイルから取得されるべきテキストが無かったので
錯覚が確信となってしまいました。
実際にはENTER_FRAMEの2回目でテキスト自体は拾えるようになって
おりました。
(1回目ではテキストファイルが読み込めなかったようです)

従いまして実際は、テキストファイルを読み込んだ後は
traceで出力できましたし、
ダイナミックテキストにも入りましたし、
変数にも入りました。
これはご指摘頂いた通りでした。

以上踏まえまして、以前に書かせて頂きましたクラスも少し整理しまして
後述のようになりましたが、テキストファイル自体は読み込める
ようになりました。
(ただ取得側でENTER_FRAMEまわりのタイミングで悩ましくはあるのですが…
これは別問題として、これから調べようかと思います。)

わかってみれば下らない質問で、大変申し訳無く思います。
貴重なお時間を割いて頂きまして、本当にありがとうございました。

//-----------------------------
package{
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;

/**
* 外部ファイル読み込みクラス。
*
* @auther
* @version 0.1
*/
public class loadFileData
{
private var contents:String;
private var loader:URLLoader;

/**
* コンストラクタ
* @param String
* @return (無し)
*/
public function loadFileData(path:String){
var request:URLRequest = new URLRequest(path);
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, loadData);
loader.load(request);
};

/**
* テキストファイル内容格納
* @param Event
* @return (無し)
*/
private function loadData(event:Event):void{
this.contents = loader.data;
};

/**
* テキストファイル内容取得
* @param (無し)
* @return String
*/
public function getContents():String{
return this.contents;
};
};
};
野中文雄
Åê¹ÆNo.44369
投稿日時: 2010-2-5 0:06
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 外部テキストファイルの内容を変数に入れたいのですが…
まず、URLLoader.completeイベントのリスナーメソッドは、何か特別な理由がないかぎり、クラスのメソッドとして定義することは正解です。そして、「何か特別な理由」が生じなければ、「"this"の向き先」をあえて研究する必要性も薄いでしょう(もちろん、知っているに越したことはありませんが)。
引用:
nish11さんは書きました:
"this"の向き先に関しては、突き詰めれば本件と直接関係
ありませんでしたので、今後の課題とさせて頂きます。

つぎに、Flashムービー側で値を取出すタイミングについて悩んでいらっしゃるようですね。仕組みとしては、外部ファイルの読込み後にその処理を行えばよいでしょう。比較的簡単なのは、つぎのようにコールバック関数を呼出すことです。
// フレームアクション
var lfData:loadFileData = new loadFileData("test.txt", getContents);
var disp_message:String;
function getContents():void {
	disp_message = lfData.getContents();
	trace(disp_message);
}

package {
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.events.Event;

	/**
	* 外部ファイル読み込みクラス。
	*
	* @auther 
	* @version 0.1
	*/
	public class loadFileData {
		private var contents:String;
		private var loader:URLLoader;
		private var onComplete:Function;

		/** 
		* コンストラクタ
		* @param String
		* @return (無し)
		*/
		public function loadFileData(path:String, callback:Function) {
			var request:URLRequest = new URLRequest(path);
			loader = new URLLoader();
			loader.addEventListener(Event.COMPLETE,loadData);
			loader.load(request);
			onComplete = callback;
		}

		/** 
		* テキストファイル内容格納
		* @param Event
		* @return (無し)
		*/
		private function loadData(event:Event):void {
			this.contents = loader.data;
			onComplete();
		}

		/** 
		* テキストファイル内容取得
		* @param (無し)
		* @return String
		*/
		public function getContents():String {
			return this.contents;
		}

	}

}

引用:
(ただ取得側でENTER_FRAMEまわりのタイミングで悩ましくはあるのですが…
これは別問題として、これから調べようかと思います。)

EventDispatcherクラスをすでに学習されていれば、これを継承してイベントリスナーとして扱うのがActionScript 3.0スタンダードでしょう。


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

nish11
Åê¹ÆNo.44378
投稿日時: 2010-2-5 23:23
新米
居住地:
投稿: 4
使用環境:
WinXP,Flash CS3
Re: 外部テキストファイルの内容を変数に入れたいのですが…
野中文雄様

丁寧なご説明とサンプルソースを頂きまして、ありがとうございました。
サンプルソースをもとに早速修正してみたところ、
無駄な判定要素を入れることも無く動かすことができました。
(前回の時点では「値が取れている」「2回目のループ」など
不細工な判定を入れてどうにか動かしていたもので…)

引用:

EventDispatcherクラスをすでに学習されていれば、これを継承してイベントリスナーとして扱うのがActionScript 3.0スタンダードでしょう。

また、上記のアドバイスもありがとうございました。
とりあえず見よう見まねで書いてみまして、
同じような動きになるところまで確認できました。


//■呼び元■
var lfData:loadFileData = new loadFileData("test.txt");
lfData.addEventListener(loadFileData.LOAD_COMPLETE, getContents);   
var contents:String;
function getContents(event:Event):void {
    contents = lfData.getContents();
    trace(contents);
};

//■loadFileDataクラス■
package {
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.events.EventDispatcher;

    /**
     * 外部ファイル読み込みクラス。
     *
     * @auther  
     * @version 0.3
     */
    public class loadFileData extends EventDispatcher
    {
        public static const LOAD_COMPLETE:String = "load_complete";
        private var contents:String;
        private var loader:URLLoader;

        /** 
         * コンストラクタ
         * @param  String
         * @return (無し)
         */
        public function loadFileData(path:String){
            var request:URLRequest = new URLRequest(path);
            loader = new URLLoader();
            loader.addEventListener(Event.COMPLETE, loadData);
            loader.load(request);
        };

        /** 
         * テキストファイル内容格納
         * @param  Event
         * @return (無し)
         */
        private function loadData(event:Event):void{
            this.contents = loader.data;
            dispatchEvent(new Event(LOAD_COMPLETE));
        };

        /** 
         * テキストファイル内容取得
         * @param  (無し)
         * @return String
         */
        public function getContents():String{
            return this.contents;
        };
    };
};


まだまだ足りない記述もあるかと思いますが、今後地道に
足していこうかと思います。

本件に関しましては貴重なお時間を頂きまして、本当にありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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