|
h-tom です。
>エクスプローラのファイル選択みたいにCtrlキーやShiftキーの
>併用で複数選択できないでしょうか?
田楽DLLを使って、ファイルヒストリを表示するダイアログを作ってみました。
複数選択も可能。
//---ここから
// ファイルヒストリ表示ダイアログ
#main = hidemaruhandle(0);
$DialogTitle = "ファイルヒストリ";
$DialogText = "開くファイルを選択してください:";
//表示するリストの作成
##i = 0;
while (1){
$ViewList[##i] = getfilehist(##i);
if($ViewList[##i] == "") break
##i = ##i + 1;
}
//ダイアログ表示
call ListDialog;
//選択項目への処理実行
if(##return){
##i = 0;
while ($SelectList[##i] != ""){
if(strstr($SelectList[##i], "://") != -1 || existfile($SelectList[##
i])){
openfile $SelectList[##i];
}
##i = ##i + 1;
}
}
endmacro;
// リスト表示ダイアログメインルーチン
// 表示に必要な変数
// $ViewList :表示する項目を格納した配列
// $SelectList :選択した項目を格納した配列
// $DialogTitle:ダイアログに表示するタイトル
// $DialogText :ダイアログの先頭に表示するメッセージ
// ---- 使用しているグローバル変数
// #ViewListMax :表示する項目数
// ---- 戻り値
// 0:選択なし or キャンセル
// 1:選択あり(結果は$SelectList[]の配列に格納)
ListDialog:
// 田楽DLLのロード
call LoadDengakuDLL;
// ダイアログ表示
call Dialog;
##Dialog = ##return;
// DLL解放
call FreeDengakuDLL;
return ##Dialog;
//.----- ダイアログ --------------------------------------------------------
--------------------
Dialog:
##action = 0;
call BeginDialog;
while (!##action) {
call WaitNotify; ##notify = ##return;
call UpdateDialog ##notify; ##action = ##return;
}
call EndDialog ##action;
return ##return;
BeginDialog:
// $$ViewListAll = "";
##_ = dllfunc("NEWDIALOG", $DialogTitle, 80);
// メッセージ
##_ = dllfunc("NEWCONTROL", "text", "", $DialogText);
// チェックリスト
##_ = dllfunc("NEWCONTROL", "chklist", "lList", "");
##_ = dllfunc("SETCTRLHEIGHT", "", 20);
// リスト追加
##i = 0;
while (1){
if($ViewList[##i] == "") break
##_ = dllfunc("SETCTRLITEM", "lList", $ViewList[##i], ##i + 1);
// $$ViewListAll = $$ViewListAll + str(##i + 1) + ",";
##i = ##i + 1;
}
#ViewListMax = ##i;
// $$ViewListAll = leftstr($$ViewListAll, strlen($$ViewListAll) - 1);
// ##_ = dllfunc("SETCTRLSTATE", "lList", $$ViewListAll);
// オプション
##_ = dllfunc("NEWCONTROL", "button", "bCheck", "全選択(&A)");
##_ = dllfunc("SETCTRLNOTIFY", "", "101");
##_ = dllfunc("SETCTRLWIDTH", "", 12);
##_ = dllfunc("NEWCONTROL", "button", "bUncheck", "全解除(&D)");
##_ = dllfunc("SETCTRLNOTIFY", "", "102");
##_ = dllfunc("SETCTRLWIDTH", "", 12);
##_ = dllfunc("NEWCONTROL", "button", "Reverses", "反転(&R)");
##_ = dllfunc("SETCTRLNOTIFY", "", "104");
##_ = dllfunc("SETCTRLWIDTH", "", 12);
// ボタン
##_ = dllfunc("NEWPAGE", 80);
##_ = dllfunc("NEWCONTROL", "text", "", "");
##_ = dllfunc("SETCTRLWIDTH", "", 56);
##_ = dllfunc("NEWCONTROL", "defbutton", "bOK", "OK");
##_ = dllfunc("SETCTRLNOTIFY", "", "1");
##_ = dllfunc("SETCTRLWIDTH", "", 12);
##_ = dllfunc("NEWCONTROL", "button", "bCancel", "キャンセル");
##_ = dllfunc("SETCTRLNOTIFY", "", "0");
##_ = dllfunc("SETCTRLWIDTH", "", 12);
if (!dllfunc("SHOWDIALOG", 0, 0)) call Error "マクロのエラーです\n発生位
置: BeginDialog";
return;
EndDialog:
$$list = dllfuncstr("GETCTRLSTATE", "lList");
if (!dllfunc("ENDDIALOG")) call Error "マクロのエラーです\n発生位置: End
Dialog";
if (##1 == 0x10) return false;
if ($$list == "") return false;
//選択されたリストを取得
$SelectList[0] = $ViewList[val(dllfuncstr("GETTOKEN", $$list, ",")) - 1];
##k = 1;
while (dllfunc("HASMORETOKENS")) {
$SelectList[##k] = $ViewList[val(dllfuncstr("GETTOKEN", "", ",")) - 1];
##k = ##k + 1;
}
$SelectList[##k] = "";
return true;
WaitNotify:
// ##return = 通知コード
while (true) {
$$n = dllfuncstr("WAITCTRLNOTIFY", 10);
if ($$n != "") return val($$n);
}
return 0; // NOTREACHED
UpdateDialog:
// ##1 = 通知コード
##action = 0x00;
if (##1 == 0) ##action = 0x10; // キャンセル
else if (##1 == 1) ##action = 0x11; // 実行
else if (##1 == 101) call _bCheck; // 全選択
else if (##1 == 102) call _bUncheck; // 全解除
else if (##1 == 104) call _Reverses; // チェック反転
return ##action;
_bCheck:
##i = 1;
while (##i <= #ViewListMax) {
$$s = $$s + str(##i) + ",";
##i = ##i + 1;
}
##_ = dllfunc("SETCTRLSTATE", "lList", $$s);
return;
_bUncheck:
##_ = dllfunc("SETCTRLSTATE", "lList", "");
return;
_Reverses:
$$checked = "," + dllfuncstr("GETCTRLSTATE","lList") + ",";
$$Reverses = "";
##i = 1;
while(##i <= #ViewListMax){
if(strstr($$checked, "," + str(##i) + ",") == -1){
$$Reverses = $$Reverses + str(##i) + ",";
}
##i = ##i + 1;
}
if($$Reverses != "") $$Reverses = leftstr($$Reverses, strlen($$Reverses)
- 1);
##_ = dllfunc("SETCTRLSTATE", "lList", $$Reverses);
return;
//.----- 共通サブルーチン --------------------------------------------------
--------------------
LoadDengakuDLL:
loaddll currentmacrodirectory + "\\DengakuDLL.dll";
if (!result) loaddll macrodir + "\\DengakuDLL.dll";
if (!result) loaddll "DengakuDLL.dll";
if (!result) call Error "DengakuDLL.dll がロードできません。\n Hidemaru.
exe と同じフォルダかマクロファイル用のフォルダに置いてください";
if (dllfuncstr("GETVERSION") < "2.80") call Error "田楽 DLL v2.80 以降を
インストールしてください";
return;
FreeDengakuDLL:
freedll;
return;
Error: // エラー
if ($$1 != "") message currentmacrobasename + ": " + $$1;
freedll;
exit;
endmacro;
//----------------------//
// デバック出力ルーチン
// デバックツールは「DBCon」等を使用する事
//「http://www.htosh.com/」
//----------------------//
DBOUT:
if(#debug == 1 && findwindowclass("DBConClass") != 0) debuginfo $$1 + "\n";
return;
//---ここまで
|
|