ファイルヒストリで複数選択No.09016
Micky さん 06/01/06 22:05
 
まいどお世話になります。

小ネタです。既にあがっていたらごめんなさい。

ファイルヒストリ便利に使っているのですが、
時々複数選択したいときがあります。

エクスプローラのファイル選択みたいにCtrlキーやShiftキーの
併用で複数選択できないでしょうか?

[ ]
RE:09016 ファイルヒストリで複数選択No.09017
h-tom さん 06/01/08 16:25
 

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;

//---ここまで

[ ]
RE:09017 ファイルヒストリで複数選択No.09018
秀丸担当 さん 06/01/10 10:50
 

メニューでは複数選択できないので、やるとしたらダイアログを出す必要がある
と思います。
と思ったらh-tomさんがマクロを作ってくれました。
ありがとうございます。
これは良いですね。
作っていただいて感謝ですが、これではどうでしょうか。>Mickyさん

[ ]
RE:09018 ファイルヒストリで複数選択No.09019
Micky さん 06/01/10 13:58
 
まいどお世話になります。

秀丸担当 さん write:

> メニューでは複数選択できないので、やるとしたらダイアログを出す必要がある
> と思います。
なるほど。

> と思ったらh-tomさんがマクロを作ってくれました。
> ありがとうございます。
> これは良いですね。
> 作っていただいて感謝ですが、これではどうでしょうか。>Mickyさん
十分目的は達成できています。使わせていただきます。
マクロで出来るとは思ってませんでした。
まだまだ修行が足らないようで > 私

ありがとうございました。 > h-tom さん, 秀丸担当 さん

[ ]