「マクロ・関数をメニューで呼び出す」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし |
(<source>タグを<syntaxhighlight>タグに置き換える) |
||
10行目: | 10行目: | ||
メニューの定義は,別途 '''menu.json''' に記述します. | メニューの定義は,別途 '''menu.json''' に記述します. | ||
'''menu.js''' と同じフォルダに置いてください. | '''menu.js''' と同じフォルダに置いてください. | ||
< | <syntaxhighlight lang="javascript"> | ||
#title = "Menu" | #title = "Menu" | ||
44行目: | 44行目: | ||
eval(fso.OpenTextFile(libdir + fn).ReadAll().replace(/^#.*/, "")); | eval(fso.OpenTextFile(libdir + fn).ReadAll().replace(/^#.*/, "")); | ||
} | } | ||
</ | </syntaxhighlight> | ||
== menu.json == | == menu.json == | ||
55行目: | 55行目: | ||
関数定義や変数への代入を,コンマ演算子を使って,前に並べておくこともできます. | 関数定義や変数への代入を,コンマ演算子を使って,前に並べておくこともできます. | ||
(ちょっとキタナい(笑)) | (ちょっとキタナい(笑)) | ||
< | <syntaxhighlight lang="javascript"> | ||
// 関数を定義する場合は,事前に関数定義をコンマで区切って並べておきます. | // 関数を定義する場合は,事前に関数定義をコンマで区切って並べておきます. | ||
// (全体を式として評価するため,実際は式をコンマ演算子で並べていることに | // (全体を式として評価するため,実際は式をコンマ演算子で並べていることに | ||
73行目: | 73行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
--[[特別:投稿記録/202.215.166.72|202.215.166.72]] 2013年8月19日 (月) 20:39 (JST) | --[[特別:投稿記録/202.215.166.72|202.215.166.72]] 2013年8月19日 (月) 20:39 (JST) | ||
2023年5月16日 (火) 23:29時点における版
お盆休みにマクロ作成に挑戦してみました. 関数やマクロをメニュー形式で呼び出すためのマクロです.
マクロの本体(コード)のファイル menu.js と,メニューそのものをオブジェクトリテラルで定義するファイル menu.json から成ります. menu.json は,menu.js と同じフォルダに置いてください.
マクロの本体です.eval を多用していてちょっとキタナいです(笑).
メニューの定義は,別途 menu.json に記述します. menu.js と同じフォルダに置いてください.
#title = "Menu"
var fso = new ActiveXObject("Scripting.FileSystemObject"),
libdir = fso.GetParentFolderName(ScriptFullName) + "\\",
menu = eval('(' + fso.OpenTextFile(libdir + "menu.json").ReadAll() + ')');
execMenu(menu);
function execMenu(menu) {
var n, i = 1, a = [null], m = CreatePopupMenu(), f;
for (n in menu) {
a.push(n);
f = undefined;
if (n.match(/^---/)) f = meMenuSeparator;
else if (!menu[n]) f = meMenuGrayed;
else if (menu[n].constructor == Number) f = menu[n];
else if (menu[n].constructor == Object) n += '\t≫';
m.Add(n, i++, f);
}
if (i = m.Track(mePosMouse)) execItem(menu[a[i]]);
}
function execItem(item) {
switch (item.constructor) {
case Function: item(); break;
case String: execMacro(item); break;
case Object: execMenu(item); break;
}
}
function execMacro(fn) {
eval(fso.OpenTextFile(libdir + fn).ReadAll().replace(/^#.*/, ""));
}
メニューを定義するファイルです.値が Object になる式で記述します. Object のプロパティ(名)がメニューに表示される項目, その値がメニュー選択時の実行内容になります.
実行される内容は,値の型によって異なりますが,詳細は下のサンプルのコメントを参考にしてください.
関数定義や変数への代入を,コンマ演算子を使って,前に並べておくこともできます. (ちょっとキタナい(笑))
// 関数を定義する場合は,事前に関数定義をコンマで区切って並べておきます.
// (全体を式として評価するため,実際は式をコンマ演算子で並べていることに
// なります)
function message2() { alert("Good Luck!"); },
flag = false,
// メニュー項目を Object で表記します.
{
"Hello": function () { alert("Hello!"); }, // 値が関数オブジェクトなら,それを実行します.
"---": null, // --- で始まるプロパティはセパレータになります.
"重複行の削除": "連続する重複行を削除.js", // 値が文字列なら,マクロを呼び出します.
"Good Luck": flag && message2, // 値が false なら,無効に(灰色に)なります.
"----": null, // 複数のセパレータを用いる場合はプロパティを変えてください.
"Sub": { // 値が Object なら,サブメニューになります.
"Good Luck": flag || message2,
"Good Bye": meMenuGrayed // これでも無効に(灰色に)なります.
}
}
--202.215.166.72 2013年8月19日 (月) 20:39 (JST)
コメント
- 実行中マクロのフルパスは ScriptFullName で参照できます.(ks)
- ありがとうございます.ScriptFullName を使って書き直してみました.(aliquis)
更新履歴
- libdir を,マクロのパスから取得するように変更しました.--202.215.166.72 2013年8月20日 (火) 21:02 (JST)
スポンサーリンク