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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     onDataで作成した配列を参照したい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
takamasa
Åê¹ÆNo.46060
投稿日時: 2010-10-11 12:02
新米
居住地: 北海道
投稿: 6
使用環境:
Windows Vista
Flash Pro8
onDataで作成した配列を参照したい
初めましてtakamasaと申します。

最近はじめたばかりのド素人です。

今回が初めての投稿です。よろしくお願いします。

質問の内容ですが、csvファイルを読み込み、onDataイベント内で多次元配列を作成して、今後はその配列から文字を取得して処理を行いたいと考えております。

具体的には以下のコードを書いております。
なお、ActionScript2.0を使用しております。

//
// スクリプトクラス(CSVファイル読み込み)
//

class SCRIPT
{
 /*------------------------------------------------------------*
| <<< 変数宣言>>>
 *--------------------------------------------------------------*/
private var csvObj; // CSVファイル読み込み用
private var aCsvStr:Array; // 読み込んだ文字列格納用
private var bFinish:Boolean = false; // 読み込み終了フラグ

/*-------------------------------------------------------------*
| <<< コンストラクタ >>>
*--------------------------------------------------------------*/
public function SCRIPT()
{
  csvObj = new LoadVars();
  aCsvStr = new Array();
}

/*-------------------------------------------------------------*
| <<< CSVファイルを読み込みます >>>
| 機能 : CSVファイルを読み込みます
| 引数 : path CSVファイルまでのパス
| 戻り値 : なし
*--------------------------------------------------------------*/
public function LoadCsv(path:String):Void
{
 csvObj.load(path);

 //読み込み時に入るイベント
 csvObj.onData = function(csvstr:String)
 {
  // myCSV を "改行コード" で split して配列を得る
 aCsvStr = csvstr.split("\r\n");

 for(var i:Number = 0; i <aCsvStr.length; i++)
 {
  aCsvStr[i] = aCsvStr[i].split(",");
 }
 bFinish = true;

 trace(aCsvStr[0][0]); //traceしてみる
 }
}

/*-------------------------------------------------------------*
| <<< 読み込み終了チェック >>>
| 機能 : 読み込みの終了をチェックします。
| 引数 : なし
| 戻り値 : なし
*--------------------------------------------------------------*/
public function LoadCheck():Boolean
{
  return bFinish;
}

/*-------------------------------------------------------------*
| <<< 読み込み中のパーセントを得る >>>
| 機能 : 現在の読み込み率を%で得る
| 引数 : なし
| 戻り値 : なし
*--------------------------------------------------------------*/
public function GetReadPercent():Number
{
return Math.floor(csvObj.getBytesLoaded() / csvObj.getBytesTotal() * 100);
}

/*-------------------------------------------------------------*
| <<< 列と行を指定して文字列を取得します >>>
| 機能 : csvファイルから指定した文字列を取得します
| 引数 : col 行
| : row 列
| 戻り値 : csvファイルの文字列
*--------------------------------------------------------------*/
public function GetStr(col:Number , row:Number):String
{
  return aCsvStr[col][row];
}
}

というような感じで書いており、メインタイムラインの1フレーム目で呼び出して使用しております。

//1フレーム目の内容
import SCRIPT

var script = new SCRIPT();

script.LoadCsv("csv_file/sample1.csv");

_root.onEnterFrame = function()
{
 if(script.GetReadPercent() == 100)
 {
  trace(script.GetStr(0 , 0));
 }
}

これを実行いたしますと、onData内のtraceではcsvファイルから読み込んだ文字列が格納されているのですが、1フレーム目のGetStr(0,0)を使用してtraceした箇所ではundefinedとなってしまいます。

なお、GetReadPercent()という関数はきちんと動作しておりました。

1フレーム目で配列に格納した文字列を参照できるようにするにはどうすればよいでしょうか?

どなたかご教授をお願いいたします。


ひろゆき
Åê¹ÆNo.46061
投稿日時: 2010-10-11 14:02
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onDataで作成した配列を参照したい
スクリプト内に全角スペースやタブ・インデントが混じっているようですが、
それを半角スペースに置換して、問題なくスクリプトが実行される環境で試されるのが先でしょう。


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

takamasa
Åê¹ÆNo.46062
投稿日時: 2010-10-11 14:47
新米
居住地: 北海道
投稿: 6
使用環境:
Windows Vista
Flash Pro8
Re: onDataで作成した配列を参照したい
ご回答ありがとうございます。

ご指摘のあった通り、すべて半角スペースに直した後で
同じコードを実行致しましたが、結果は同じでした。

onData内で配列をtraceして表示するときちんと表示されますが、
それ以外の箇所で行うとundefinedとなります。
ひろゆき
Åê¹ÆNo.46063
投稿日時: 2010-10-11 14:56
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onDataで作成した配列を参照したい
きちんと変数が渡っているかどうかは、traceしまくれば分かります。
例えば、以下のようにすると、aCsvStrも、bFinishも、undefinedです。
csvObj.onData = function(csvstr:String)
 {
 trace(aCsvStr);
 aCsvStr = csvstr.split("\r\n");

 for(var i:Number = 0; i <aCsvStr.length; i++)
 {
  aCsvStr[i] = aCsvStr[i].split(",");
 }
 trace(bFinish);
 bFinish = true;
}


スコープの問題ですね。

for文とボタンアクション
Buttonのthis
forループでMovieClipに設定したイベントハンドラメソッドから変数を参照する

Delegateとスコープ (1)
Delegateとスコープ (2)
Delegateとスコープ (3)
Delegateとスコープ (4)


クラス名は、大文字から、メソッド名は、小文字から始めるのが通例だと思います。
なので、全面的にスクリプトを書き換えました。

[case1]
_root 第1フレーム
var loader:CSVLoader = new CSVLoader();

loader.load("sample.csv");
loader.onData = function(src:String):Void {
	trace(this.getData(0, 0));
};

CSVLoader.as
import mx.utils.Delegate;

class CSVLoader {
	private var csv:LoadVars;
	private var data:Array;

	public function CSVLoader() {
		csv = new LoadVars();
		data = new Array();
	}

	public function load(path:String):Void {
		csv.onData = Delegate.create(this, parse);
		csv.load(path);
	}
	private function parse(src:String):Void {
		if (src) {
			data = src.split("\r\n");
			for (var n:Number = 0; n < data.length; n++) {
				data[n] = data[n].split(",");
			}
			onData(src);
		}
	}
	public function onData(src:String):Void {
	}
	public function getData(col:Number, row:Number):String {
		return data[col][row];
	}

}


[case2]
_root 第1フレーム
var loader:CSVLoader = new CSVLoader();

loader.addEventListener("loaded", parse);
loader.load("sample.csv");

function parse(evt:Object):Void {
	var data:Array = evt.data;
	trace(data[0][0]);
}

CSVLoader.as
import mx.utils.Delegate;
import mx.events.EventDispatcher;

class CSVLoader {
	private var csv:LoadVars;
	private var data:Array;
	public var addEventListener:Function;
	public var removeEventListener:Function;
	private var dispatchEvent:Function;

	public function CSVLoader() {
		EventDispatcher.initialize(this);
		csv = new LoadVars();
		data = new Array();
	}

	public function load(path:String):Void {
		csv.onData = Delegate.create(this, parse);
		csv.load(path);
	}
	private function parse(src:String):Void {
		if (src) {
			data = src.split("\r\n");
			for (var n:Number = 0; n < data.length; n++) {
				data[n] = data[n].split(",");
			}
			dispatchEvent({type: "loaded", data: data});
		}
	}

}


[case3]
_root 第1フレーム
var loader:CSVLoader = new CSVLoader();

loader.addEventListener("loaded", parse);
loader.load("sample.csv");

function parse(evt:Object):Void {
	trace(evt.target.getData(0, 0));
}

CSVLoader.as
import mx.utils.Delegate;
import mx.events.EventDispatcher;

class CSVLoader {
	private var csv:LoadVars;
	private var data:Array;
	public var addEventListener:Function;
	public var removeEventListener:Function;
	private var dispatchEvent:Function;

	public function CSVLoader() {
		EventDispatcher.initialize(this);
		csv = new LoadVars();
		data = new Array();
	}

	public function load(path:String):Void {
		csv.onData = Delegate.create(this, parse);
		csv.load(path);
	}
	private function parse(src:String):Void {
		if (src) {
			data = src.split("\r\n");
			for (var n:Number = 0; n < data.length; n++) {
				data[n] = data[n].split(",");
			}
			dispatchEvent({type: "loaded"});
		}
	}
	public function getData(col:Number, row:Number):String {
		return data[col][row];
	}

}


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

takamasa
Åê¹ÆNo.46064
投稿日時: 2010-10-11 17:34
新米
居住地: 北海道
投稿: 6
使用環境:
Windows Vista
Flash Pro8
Re: onDataで作成した配列を参照したい
改善案をいくつもご提示いただいた上に、参考になるWebページの情報まで教えていただきありがとうございます。

おかげ様でやりたかったことができました。

ひろゆき様、本当にありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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