「マクロ・関数をメニューで呼び出す」の版間の差分
ナビゲーションに移動
検索に移動
SyntaxHighlightにcopyの追加 |
|||
| (3人の利用者による、間の20版が非表示) | |||
| 1行目: | 1行目: | ||
お盆休みにマクロ作成に挑戦してみました。関数やマクロをメニュー形式で呼び出すためのマクロです。 | |||
マクロの本体(コード)のファイル | マクロの本体(コード)のファイル menu.js と、メニューそのものをオブジェクトリテラルで定義するファイル menu.json から成ります。menu.json は、menu.js と同じフォルダに置いてください。 | ||
== menu.js == | == ソースコード == | ||
=== menu.js === | |||
マクロの本体です。eval を多用していてちょっとキタナいです(笑)。 | |||
メニューの定義は、別途 menu.json に記述します。menu.js と同じフォルダに置いてください。 | |||
< | |||
<syntaxhighlight lang="javascript" copy> | |||
#title = "Menu" | #title = "Menu" | ||
var fso = new ActiveXObject("Scripting.FileSystemObject"), | var fso = new ActiveXObject("Scripting.FileSystemObject"), | ||
libdir = fso.GetParentFolderName( | libdir = fso.GetParentFolderName(ScriptFullName) + "\\", | ||
menu = eval('(' + fso.OpenTextFile(libdir + "menu.json").ReadAll() + ')'); | menu = eval('(' + fso.OpenTextFile(libdir + "menu.json").ReadAll() + ')'); | ||
| 44行目: | 43行目: | ||
eval(fso.OpenTextFile(libdir + fn).ReadAll().replace(/^#.*/, "")); | eval(fso.OpenTextFile(libdir + fn).ReadAll().replace(/^#.*/, "")); | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== menu.json === | |||
メニューを定義するファイルです。値が Object になる式で記述します。 | |||
Object のプロパティ(名)がメニューに表示される項目、その値がメニュー選択時の実行内容になります。 | |||
実行される内容は、値の型によって異なりますが、詳細は下のサンプルのコメントを参考にしてください。 | |||
関数定義や変数への代入を、コンマ演算子を使って、前に並べておくこともできます(ちょっとキタナい(笑))。 | |||
< | <syntaxhighlight lang="javascript" copy> | ||
// | // 関数を定義する場合は、事前に関数定義をコンマで区切って並べておきます。 | ||
// ( | // (全体を式として評価するため、実際は式をコンマ演算子で並べていることに | ||
// なります) | // なります) | ||
function message2() { alert("Good Luck!"); }, | function message2() { alert("Good Luck!"); }, | ||
flag = false, | flag = false, | ||
// メニュー項目を Object | // メニュー項目を Object で表記します。 | ||
{ | { | ||
"Hello": function () { alert("Hello!"); }, // | "Hello": function () { alert("Hello!"); }, // 値が関数オブジェクトなら、それを実行します。 | ||
"---": null, // --- | "---": null, // --- で始まるプロパティはセパレータになります。 | ||
"重複行の削除": "連続する重複行を削除.js", // | "重複行の削除": "連続する重複行を削除.js", // 値が文字列なら、マクロを呼び出します。 | ||
"Good Luck": flag && message2, // 値が false | "Good Luck": flag && message2, // 値が false なら、無効に(灰色に)なります。 | ||
"----": null, // | "----": null, // 複数のセパレータを用いる場合はプロパティを変えてください。 | ||
"Sub": { // 値が Object | "Sub": { // 値が Object なら、サブメニューになります。 | ||
"Good Luck": flag || message2, | "Good Luck": flag || message2, | ||
"Good Bye": meMenuGrayed // これでも無効に(灰色に) | "Good Bye": meMenuGrayed // これでも無効に(灰色に)なります。 | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
== コメント == | |||
* 実行中マクロのフルパスは ScriptFullName で参照できます。(ks) | |||
* ありがとうございます。ScriptFullName を使って書き直してみました。(aliquis) | |||
== 変更履歴 == | |||
* 1.0.0 (2013-08-20) | |||
** libdir をマクロのパスから取得するように変更しました | |||
2025年6月30日 (月) 00:53時点における最新版
お盆休みにマクロ作成に挑戦してみました。関数やマクロをメニュー形式で呼び出すためのマクロです。
マクロの本体(コード)のファイル 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 // これでも無効に(灰色に)なります。
}
}
コメント[編集]
- 実行中マクロのフルパスは ScriptFullName で参照できます。(ks)
- ありがとうございます。ScriptFullName を使って書き直してみました。(aliquis)
変更履歴[編集]
- 1.0.0 (2013-08-20)
- libdir をマクロのパスから取得するように変更しました
スポンサーリンク