すごく今さら感ありますが、つまづいたのでメモ。
Flash ネイティブの LoadVars クラスを委譲して、CSV を読み込み解析するクラスを作ってみたんですが、LoadVars.onLoad でハマってました。
結論言うとこうなんですね。
・LoadVars.onLoad は読込データの解析が完了したときのイベント
・LoadVars.onData はデータ読込み完了のイベント
なるほど。
Flashやってずいぶん経ちますが今まで気づかなかった・・・org
・URLエンコードしたテキストデータ → LoadVars.onLoad
・生テキストデータ(CSV含む) → LoadVars.onData
ってことですね。
AS3だと明示的に指定できるみたいで、やっぱよく考えられてるなぁと。
外部ドキュメントからのデータのロード ~ 外部データの操作 -- Flex 2
Apollo でさくっと CSV エディタとか作れそうな予感。。
class CSVLoader{
var data:Array;
private var _loader:LoadVars;
private var _onLoad:Function;
function CSVLoader(){
this.data = new Array();
this._loader = new LoadVars();
this._loader.owner = this;
}
/**
* CSVファイルの読込
* @param url 対象ファイルのURI
*/
function load(url:String){
// ロード時の処理がなければ強制的に設定
if(!_onLoad){onLoad = null;}
// ロード開始
_loader.load(url);
}
/**
* CSV読込時に呼ばれるコールバック
*/
function set onLoad(f:Function){
_onLoad = f;
_loader.onData = function(src:String){
var success:Boolean = Boolean(src);
if(success){
this.owner.data = this.owner._parseCSV(src);
}
this.owner._onLoad(success);
}
}
function get onLoad():Function{
return _onLoad;
}
/**
* CSVデータをパースして多重配列に
*/
private function _parseCSV(rawdata:String):Array{
// 改行コードの差異をなくしすべて \n に
rawdata = (rawdata.split("\r\n")).join("\n");
rawdata = (rawdata.split("\r")).join("\n");
// CSVを多重配列に
var data:Array = new Array();
var tmp:Array = rawdata.split("\n");
var l:Number = tmp.length;
for(var i:Number=0; i<l; i++){
data.push(tmp[i].split(","));
}
// 最終行が空白ならば削除しておく
if(data[data.length-1].length == 1 && data[data.length-1][0] == ""){data.pop();}
// 戻す
return data;
}
/**
* 文字列への変換
*/
function toString():String{
var s:String = "[CSVLoader]\n";
for(var i:Number=0; i<data.length; i++){
s += " ["+i+"] " + data[i] + "\n";
}
return s;
}
}

いつも参考にさせていただいてます。
一つ質問なのですが、コンストラクタのところで、
this._loader.owner = this;
としているのはなぜなんでしょうか。
たぶんコールバックの概念がよくわかっていないのだと思いますが、
何かヒントをいただけませんでしょうか?
Ryosuke.H さん、どうも。
ちょっと最近AS3がメインなので理由を忘れかけてました、、、すいません。
えと、途中 _loader.onData を定義している箇所がありますよね?
AS2だとこの関数の中でのスコープがズレるんですよ。
_loader.onData 内の this は CSVLoader インスタンスではなくて、_loader プロパティを指すんですよね。なので、_loader → CSVLoader インスタンス、この参照をつなぐために、_loader に owner というプロパティをつけてあげてるってことです。
そこらへん、livedoc にも記事がありますね。
イベントハンドラのスコープ
http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000846.html
ちなみに、AS3だとこういうスコープのズレは起こらない(起こりづらい)ので楽ちんです。
解説ありがとうございます。
御礼が遅くなりました。
私も職場でAS2を触りつつ、自宅でAS3を勉強しているので、頭がこんがらがりそうです。
イベントでお会いできれば光栄です。
ご健闘お祈りします。