Enum リファレンス
COM のコレクション(FolderItems、Scripting.FileSystemObject の Drives、TabCtrl など)を順に列挙する Enum オブジェクトのリファレンスです。JScript の Enumerator に相当します。
- 関連: te リファレンス、api リファレンス(
api.CreateObject)、FolderItems リファレンス、TabCtrl リファレンス
記法: M=メソッド。メンバー名の照合は大文字小文字を区別しません。
目次
1. 取得方法
api.CreateObject("Enum", collection)
const e = api.CreateObject("Enum", fso.Drives);
- 第2引数に、列挙したいコレクション(オブジェクト)を渡します。省略すると何も列挙できません(作成はされますが、すぐに
atEnd()が真になります)。 - 作成した時点で、最初の要素を先に取り出しています。
moveFirst()を呼ぶ必要はありません。 te.Enumのようなte側の入口はありません。
2. メソッド
| 名前 | 戻り値 | 説明 |
|---|---|---|
atEnd() |
bool | 列挙が終了(または列挙不能)なら true |
item() |
値 | 現在の要素を返す。atEnd() が真のときは呼ばないこと(値は不定) |
moveNext() |
なし | 次の要素へ進む |
moveFirst() |
なし | 先頭に戻り、先頭の要素を取り出す |
典型的なループは次の形です(Enumerator と同じです)。
for (const e = api.CreateObject("Enum", collection); !e.atEnd(); e.moveNext()) {
const item = e.item();
}
3. 列挙できるもの
次の順に判定して、最初に成り立ったものを使います。
| 渡すオブジェクト | 列挙される内容 |
|---|---|
IShellWindows(Shell.Application の Windows()) |
開いているシェルウィンドウ |
FolderItems(FV.Items()、FV.SelectedItems()、te.FolderItems() など) |
FolderItem |
_NewEnum(DISPID_NEWENUM)を持つオブジェクト |
その列挙子が返す要素(fso.Drives、TabCtrl、Memory、WICBitmap 以外の多くの COM コレクション) |
上記のいずれでもない IDispatchEx |
メンバー名(プロパティ名)を文字列として順に返す(for…in と同様) |
| 上記のいずれでもない | 何も列挙せず、atEnd() が最初から true |
- 列挙子が使えるオブジェクトのときの
moveFirst()は、元の列挙子のReset()を呼びます。メンバー名を返す場合は、先頭から数え直します。 - メンバー名の列挙で、配列(
Array)を渡した場合の動作(添字が文字列で返るかなど)は、スクリプトエンジンに依存するため要確認です。
4. 注意点
- 要素は列挙するたびに取り出されるため、列挙中にコレクションを変更すると結果が不定になります。
atEnd()の判定は、直前に要素を取り出せたかどうかで決まります。要素を取り出さずにatEnd()だけを繰り返すと終わりません(moveNext()を必ず呼ぶこと)。- 非同期スクリプト(
ui.jsなど WebView2 側)では、CreateObjectを含む各メソッド呼び出しにawaitが必要です。
5. 使用例
// ドライブを列挙(Scripting.FileSystemObject)
const fso = api.CreateObject("Scripting.FileSystemObject");
for (const e = api.CreateObject("Enum", fso.Drives); !e.atEnd(); e.moveNext()) {
const drive = e.item();
// drive.DriveLetter, drive.TotalSize ...
}
// FolderItems を列挙
const Items = FV.SelectedItems();
for (const e = api.CreateObject("Enum", Items); !e.atEnd(); e.moveNext()) {
const path = e.item().Path;
}
// プロパティ名を列挙
const o = api.CreateObject("Object");
o.a = 1;
o.b = 2;
for (const e = api.CreateObject("Enum", o); !e.atEnd(); e.moveNext()) {
const key = e.item(); // "a", "b"
}
// 非同期スクリプト(WebView2 側)
for (let list = await api.CreateObject("Enum", collection); !await list.atEnd(); await list.moveNext()) {
const item = await list.item();
}
FolderItems の列挙は、通常は
for...inや添字アクセスのほうが簡単です(FolderItemsはCountとItem(i)で、TabCtrlもfor...inで列挙できます)。Enumは、_NewEnumだけを提供する COM コレクションや、メンバー名の列挙に使います。