JScriptでのCOMのイテレーション

2007/07/25

COMオブジェクトのコレクションを順番に処理する場合、VBScriptではFor Each ~ in ~で処理できるので、JScriptでもfor ~ inでいけると思いきやNG。
JScriptからはEnumeratorを使ってアクセスするようだ。

var fsobj = new ActiveXObject("Scripting.FileSystemObject");
var folder = fsobj.GetFolder("c:\\tmp");
var e = new Enumerator(folder.Files);
for(; !e.atEnd(); e.moveNext()) {
    var file = e.item();
    ・・・
}

Enumeratorにコレクションを与えてnewして、atEnd()とmoveNext()を使ったループの中でFileオブジェクトをitem()で取得しつつ、ぐるぐる回すのがオーソドックスなやり方みたい。
でも、for(; !e.atEnd(); e.moveNext()) ~っていうのがカッコわるくて気に入らない。

そこで、Enumeratorのprototypeにeachを追加したらスマートに書けるのでは?と思い、書いてみたのが以下のコード。
通常の処理の中ではeachメソッドでぐるぐる回せる。

//Enumeratorにeachメソッドを追加
Enumerator.prototype.each = function(func) {
    this.moveFirst();
    for(; !this.atEnd(); this.moveNext()) {
        func(this.item());
    }
}
//通常の処理
var fsobj = new ActiveXObject("Scripting.FileSystemObject");
var folder = fsobj.GetFolder(fm.dir.value);
var e = new Enumerator(folder.Files);
//eachでループ
e.each(
    function(file){document.write(file.Name);}
);

MS系 | コメント(0) | トラックバック(0)
トラックバック
トラックバックURL:
コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)