CommonDialog リファレンス
「ファイルを開く」「名前を付けて保存」ダイアログ(Win32 の OPENFILENAME)を扱う CommonDialog オブジェクトのリファレンスです。
- 関連: te リファレンス、api リファレンス
記法: P=プロパティ(読み書き)、M=メソッド。メンバー名の照合は大文字小文字を区別しません。
目次
1. 取得方法
const commdlg = api.CreateObject("CommonDialog"); // 推奨
const commdlg2 = te.CommonDialog; // te.CommonDialog も同じ(参照のたびに新規生成)
- 作成時に、オーナーウィンドウがその時点の最前面ウィンドウに設定されます。
- 初期状態の
MaxFileSizeは260(MAX_PATH)です。
2. メソッド
| 名前 | 戻り値 | 説明 |
|---|---|---|
ShowOpen() |
bool | 「ファイルを開く」ダイアログを表示する。OK で true、キャンセル・失敗で false。選択結果は FileName に入る。Flags に OFN_ENABLEHOOK を含めると、フォルダなども選択できる(4章) |
ShowSave() |
bool | 「名前を付けて保存」ダイアログを表示する。戻り値と結果の扱いは ShowOpen と同じ。OFN_ENABLEHOOK の特別な処理はない |
どちらも、表示前にファイル名のバッファが未確保なら、MaxFileSize 文字分を確保し、空の文字列で初期化します。
3. プロパティ
| 名前 | 型 | 説明 |
|---|---|---|
FileName |
string | ダイアログの初期ファイル名/選択結果のパス。代入した文字列は MaxFileSize 文字までに切り詰められる |
InitDir |
string | 最初に表示するフォルダ |
Filter |
string | ファイルの種類。"説明|パターン|説明|パターン…" の形式で、区切りに | を使う(内部で NUL に変換される)。例: "Text|*.txt|All files|*.*"。; で複数パターンを並べられる("*.jpg;*.png")。取得時の値は InitDir の内容が返る(実装の都合)ため、読み出しには使わない |
FilterIndex |
int | 選択中のフィルターの番号(1始まり)。0 は未指定(「カスタムフィルター」) |
DefExt |
string | 拡張子が省略されたときに付ける既定の拡張子(. なし。例: "txt") |
Title |
string | ダイアログのタイトル |
Flags |
int | OFN_* フラグ(下記6章) |
FlagsEx |
int | OPENFILENAME.FlagsEx(拡張フラグ)を読み書きする。Flags とは別の値で、初期値は 0。ShowOpen / ShowSave のどちらにも渡される。指定できる値は Windows SDK の定義による(SDK では OFN_EX_NOPLACESBAR = 1) |
MaxFileSize |
int | FileName のバッファ文字数 |
- 文字列プロパティ(
InitDir、DefExt、Title、Filter)は、文字列を渡したときだけ更新されます(数値などを渡しても無視されます)。 Filterは引数に文字列以外を渡すと、現在のフィルターが破棄されて空になります。
4. OFN_ENABLEHOOK(フォルダ選択)
ShowOpen で Flags に OFN_ENABLEHOOK(0x20) を含めると、TE 独自の動作になります(ShowSave では無効)。
- 通常のファイル選択と違い、ダイアログの「開く」ボタン(OK)を押したときに、現在表示しているフォルダ、またはフォーカスされている項目のパスが
FileNameに入ります。フォルダや、仮想フォルダ(コントロールパネルなど)も選択対象にできます。 - 項目が選択されていればその項目(フォルダでもファイルでも)、何も選択されていなければ表示中のフォルダ自体が結果になります。
- 結果は、そのパスのパース名(
SHGDN_FORPARSING | SHGDN_FORADDRESSBAR)です。 ShowOpenを呼ぶと、内部でOFN_ENABLEHOOKビットがFlagsから取り除かれます(呼び出し後にFlagsを読むと、このビットは含まれません)。続けて使う場合は、毎回Flagsに付け直してください。- 戻り値は、この方法で選択したときも
trueになります。
sync.js の OpenDialogEx が、bFilesOnly が偽のときにこのフラグを付けて、ファイルとフォルダの両方を選べるようにしています。
5. 注意点
MaxFileSizeはFileNameの設定前に変更してください。 ファイル名のバッファは、最初にFileNameを設定したとき、または最初にダイアログを表示したときに確保されます。確保後にMaxFileSizeを増やしても、バッファは拡張されません。- ダイアログはモーダルに表示され、閉じるまで呼び出しがブロックされます。
- TE のダークモードが有効なとき、ダイアログ内のコントロールにはダークモード用のテーマが適用されます。
FileNameを設定せずにShowOpenを呼ぶと、ファイル名欄は空で始まります。
6. 定数
consts.js で定義されています。
OFN_*(Flags)
OFN_READONLY = 1 / OFN_OVERWRITEPROMPT = 2 / OFN_HIDEREADONLY = 4 / OFN_NOCHANGEDIR = 8 / OFN_SHOWHELP = 0x10 / OFN_ENABLEHOOK = 0x20 / OFN_ENABLETEMPLATE = 0x40 / OFN_ENABLETEMPLATEHANDLE = 0x80 / OFN_NOVALIDATE = 0x100 / OFN_ALLOWMULTISELECT = 0x200 / OFN_EXTENSIONDIFFERENT = 0x400 / OFN_PATHMUSTEXIST = 0x800 / OFN_FILEMUSTEXIST = 0x1000 / OFN_CREATEPROMPT = 0x2000 / OFN_SHAREAWARE = 0x4000 / OFN_NOREADONLYRETURN = 0x8000 / OFN_NOTESTFILECREATE = 0x10000 / OFN_NONETWORKBUTTON = 0x20000 / OFN_NOLONGNAMES = 0x40000 / OFN_EXPLORER = 0x80000 / OFN_NODEREFERENCELINKS = 0x100000 / OFN_LONGNAMES = 0x200000 / OFN_ENABLEINCLUDENOTIFY = 0x400000 / OFN_ENABLESIZING = 0x800000 / OFN_DONTADDTORECENT = 0x2000000 / OFN_FORCESHOWHIDDEN = 0x10000000
よく使う組み合わせ: OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_NODEREFERENCELINKS(sync.js の OpenDialogEx と同じ)
7. 使用例
// ファイルを開く
const commdlg = api.CreateObject("CommonDialog");
commdlg.InitDir = "C:\\Users";
commdlg.Title = "画像を選択";
commdlg.Filter = "画像|*.jpg;*.png;*.gif|すべてのファイル|*.*";
commdlg.FilterIndex = 1;
commdlg.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_NODEREFERENCELINKS;
if (commdlg.ShowOpen()) {
const path = commdlg.FileName;
}
// 名前を付けて保存(既存ファイルは上書き確認)
const save = api.CreateObject("CommonDialog");
save.FileName = "output.txt";
save.DefExt = "txt";
save.Filter = "テキスト|*.txt|すべてのファイル|*.*";
save.Flags = OFN_OVERWRITEPROMPT | OFN_EXPLORER | OFN_ENABLESIZING | OFN_NOCHANGEDIR;
if (save.ShowSave()) {
const dest = save.FileName;
}
// フォルダも選べる「開く」(OFN_ENABLEHOOK)
const dlg = api.CreateObject("CommonDialog");
dlg.InitDir = "C:\\";
dlg.Filter = "すべてのファイル|*.*";
dlg.Flags = OFN_FILEMUSTEXIST | OFN_EXPLORER | OFN_ENABLESIZING | OFN_ENABLEHOOK;
if (dlg.ShowOpen()) {
const folderOrFile = dlg.FileName;
}
// 長いパスに備えて、バッファを先に広げる
const big = api.CreateObject("CommonDialog");
big.MaxFileSize = 1024; // FileName を設定する前に
big.FileName = "";
sync.jsにOpenDialogEx(path, filter, bFilesOnly)と、フィルターの文字列を作るMakeCommDlgFilterがあります。TE の標準スクリプトでは、これらを経由して呼ぶ使い方が一般的です。