「ポップアップメニューを手軽に扱う」の版間の差分
<source>タグを<syntaxhighlight>タグに置き換える |
|||
| 1行目: | 1行目: | ||
マクロではないのですが、Meryのポップアップメニューを手軽に扱える関数を書いてみました。 | マクロではないのですが、Meryのポップアップメニューを手軽に扱える関数を書いてみました。 | ||
< | <syntaxhighlight lang="javascript"> | ||
function ShowPopupMenu(menu_obj, position, separator, esc){ | function ShowPopupMenu(menu_obj, position, separator, esc){ | ||
var MAX_NEST = 5;//ネストの最大深度 | var MAX_NEST = 5;//ネストの最大深度 | ||
| 115行目: | 115行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
== 簡単な使い方 == | == 簡単な使い方 == | ||
< | <syntaxhighlight lang="javascript"> | ||
var x = ShowPopupMenu(["Spring","Summer","Autumn","Winter"] ); | var x = ShowPopupMenu(["Spring","Summer","Autumn","Winter"] ); | ||
Document.Write(x); | Document.Write(x); | ||
</ | </syntaxhighlight> | ||
選択された文字列が挿入されます。 | 選択された文字列が挿入されます。 | ||
== リファレンス == | == リファレンス == | ||
< | <syntaxhighlight lang="javascript"> | ||
function ShowPopupMenu( | function ShowPopupMenu( | ||
menu_obj : Object | Array, | menu_obj : Object | Array, | ||
| 131行目: | 131行目: | ||
esc : Anything | esc : Anything | ||
) | ) | ||
</ | </syntaxhighlight> | ||
'''返り値''' : 選択されたメニューに対応する値。後述。 | '''返り値''' : 選択されたメニューに対応する値。後述。 | ||
| 147行目: | 147行目: | ||
第1引数に配列を指定するとその配列内の要素をメニューに表示します。 | 第1引数に配列を指定するとその配列内の要素をメニューに表示します。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var list = ["メニュー1","メニュー2","メニュー3","メニュー4"] | var list = ["メニュー1","メニュー2","メニュー3","メニュー4"] | ||
</ | </syntaxhighlight> | ||
SowPopupMenu関数の返り値は選択された要素になります。 | SowPopupMenu関数の返り値は選択された要素になります。 | ||
| 156行目: | 156行目: | ||
オブジェクトのキーがメニューに表示ます。キーに対応する値が返り値になります。(値が関数オブジェクトの時は後述。) | オブジェクトのキーがメニューに表示ます。キーに対応する値が返り値になります。(値が関数オブジェクトの時は後述。) | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = {}; | var menu = {}; | ||
menu["メニュー1"] = "メニュー1"; | menu["メニュー1"] = "メニュー1"; | ||
menu["メニュー2"] = 2; | menu["メニュー2"] = 2; | ||
</ | </syntaxhighlight> | ||
こうするとサブメニューを作れます。 | こうするとサブメニューを作れます。 | ||
< | <syntaxhighlight lang="javascript"> | ||
menu["グループ1"] = {}; | menu["グループ1"] = {}; | ||
menu["グループ1"]["サブメニュー1"] = "SubMenu1"; | menu["グループ1"]["サブメニュー1"] = "SubMenu1"; | ||
</ | </syntaxhighlight> | ||
連続したハイフン4つ(----)をキー内に含む場合セパレータになります。 | 連続したハイフン4つ(----)をキー内に含む場合セパレータになります。 | ||
< | <syntaxhighlight lang="javascript"> | ||
menu["----"] = 0; //何らかの値を入れておく。 | menu["----"] = 0; //何らかの値を入れておく。 | ||
list = ["menu1","menu----2","menu3"] //配列でも可能。 | list = ["menu1","menu----2","menu3"] //配列でも可能。 | ||
</ | </syntaxhighlight> | ||
=== 使用例 === | === 使用例 === | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = {}; | var menu = {}; | ||
| 189行目: | 189行目: | ||
menu["グループ1"]["----"] = 0; | menu["グループ1"]["----"] = 0; | ||
menu["グループ1"]["サブメニュー2"] = "Submenu2"; | menu["グループ1"]["サブメニュー2"] = "Submenu2"; | ||
</ | </syntaxhighlight> | ||
このように指定することも可能です。 | このように指定することも可能です。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = { | var menu = { | ||
"メニュー1" : "メニュー1", | "メニュー1" : "メニュー1", | ||
| 202行目: | 202行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== 返り値 === | === 返り値 === | ||
| 208行目: | 208行目: | ||
オブジェクトでメニューを定義するする場合、値が関数オブジェクトかそれ以外かで返り値が変わります。 | オブジェクトでメニューを定義するする場合、値が関数オブジェクトかそれ以外かで返り値が変わります。 | ||
関数オブジェクトを指定するとその関数を実行して、その関数の返り値がShowPopupMenu関数の返り値になります。 | 関数オブジェクトを指定するとその関数を実行して、その関数の返り値がShowPopupMenu関数の返り値になります。 | ||
< | <syntaxhighlight lang="javascript"> | ||
function func1(){ | function func1(){ | ||
Document.Write("func1"); | Document.Write("func1"); | ||
| 216行目: | 216行目: | ||
var menu = {}; | var menu = {}; | ||
menu["func1"] = func1; // func1() 、ではない。(括弧は付けない) | menu["func1"] = func1; // func1() 、ではない。(括弧は付けない) | ||
</ | </syntaxhighlight> | ||
「func1」がエディターのキャレット位置に挿入され、0が返ります。 | 「func1」がエディターのキャレット位置に挿入され、0が返ります。 | ||
| 222行目: | 222行目: | ||
もちろんfunctionリテラルで直接書いてもかまいません。 | もちろんfunctionリテラルで直接書いてもかまいません。 | ||
< | <syntaxhighlight lang="javascript"> | ||
menu["func2"] = function(){Alert("func2");}; | menu["func2"] = function(){Alert("func2");}; | ||
</ | </syntaxhighlight> | ||
関数オブジェクト以外を値とした場合はその値がそのまま返ります。 | 関数オブジェクト以外を値とした場合はその値がそのまま返ります。 | ||
| 232行目: | 232行目: | ||
第2引数にmePosMouseを指定するとマウスカーソルの位置にメニューが表示されます。 | 第2引数にmePosMouseを指定するとマウスカーソルの位置にメニューが表示されます。 | ||
< | <syntaxhighlight lang="javascript"> | ||
ShowPopupMenu(menu, mePosMouse) | ShowPopupMenu(menu, mePosMouse) | ||
</ | </syntaxhighlight> | ||
それ以外の値の時はキャレット位置に表示します。 | それ以外の値の時はキャレット位置に表示します。 | ||
| 240行目: | 240行目: | ||
第3引数にfalseを指定するとセパレーターを挿入しなくなります。また文字列を指定するとその文字列が含まれるメニューをセパレータにします。それ以外の値は無視します。 | 第3引数にfalseを指定するとセパレーターを挿入しなくなります。また文字列を指定するとその文字列が含まれるメニューをセパレータにします。それ以外の値は無視します。 | ||
< | <syntaxhighlight lang="javascript"> | ||
ShowPopupMenu(menu,0,false) // セパレーターを挿入しない | ShowPopupMenu(menu,0,false) // セパレーターを挿入しない | ||
ShowPopupMenu(menu,0,"ああああ") // 「ああああ」が含まれるメニューをセパレータにします。 | ShowPopupMenu(menu,0,"ああああ") // 「ああああ」が含まれるメニューをセパレータにします。 | ||
</ | </syntaxhighlight> | ||
第4引数でメニューをESCキーで閉じた時の挙動を変更できます。デフォルトではそこでスクリプトの実行が終了します。 | 第4引数でメニューをESCキーで閉じた時の挙動を変更できます。デフォルトではそこでスクリプトの実行が終了します。 | ||
関数オブジェクトを指定するとその関数を実行し、それ以外の値(undefinedを除く)の場合はその値を返します。 | 関数オブジェクトを指定するとその関数を実行し、それ以外の値(undefinedを除く)の場合はその値を返します。 | ||
< | <syntaxhighlight lang="javascript"> | ||
ShowPopupMenu(menu,0,0,-1) | ShowPopupMenu(menu,0,0,-1) | ||
</ | </syntaxhighlight> | ||
上の例ではESCキーを押してもスクリプトは終了せず、関数は-1を返します。 | 上の例ではESCキーを押してもスクリプトは終了せず、関数は-1を返します。 | ||
| 257行目: | 257行目: | ||
デフォルトではメニューの最大階層は5(2行目のMAX_NESTの値を書き換えることで変更可能)になっています。これは | デフォルトではメニューの最大階層は5(2行目のMAX_NESTの値を書き換えることで変更可能)になっています。これは | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = {}; | var menu = {}; | ||
menu["メニュー1"] = 1; | menu["メニュー1"] = 1; | ||
menu["グループ1"] = menu; | menu["グループ1"] = menu; | ||
</ | </syntaxhighlight> | ||
といった再帰定義で無限ループになるのを防ぐためです。 | といった再帰定義で無限ループになるのを防ぐためです。 | ||
| 267行目: | 267行目: | ||
=== Tips === | === Tips === | ||
< | <syntaxhighlight lang="javascript"> | ||
menu["Now?"] = new Date(); | menu["Now?"] = new Date(); | ||
</ | </syntaxhighlight> | ||
こう書くとマクロを実行したとき(正確にはオブジェクトに代入した瞬間)の時間になります。これをメニューが選択された時の時間にするときは | こう書くとマクロを実行したとき(正確にはオブジェクトに代入した瞬間)の時間になります。これをメニューが選択された時の時間にするときは | ||
< | <syntaxhighlight lang="javascript"> | ||
menu["Now!!"] = function(){return new Date();}; | menu["Now!!"] = function(){return new Date();}; | ||
</ | </syntaxhighlight> | ||
こうやってfunctionでくるんでください。 | こうやってfunctionでくるんでください。 | ||
== おまけ == | == おまけ == | ||
サブメニューとかいいから簡単に使いたいという人向け。 | サブメニューとかいいから簡単に使いたいという人向け。 | ||
< | <syntaxhighlight lang="javascript"> | ||
function ShowMenuMini(list){ | function ShowMenuMini(list){ | ||
var pos = 0; | var pos = 0; | ||
| 300行目: | 300行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== リファレンス === | === リファレンス === | ||
< | <syntaxhighlight lang="javascript"> | ||
function ShowMenuMini( | function ShowMenuMini( | ||
list : Array | list : Array | ||
) | ) | ||
</ | </syntaxhighlight> | ||
引数には配列を指定する。選択された要素のインデックスが返り値になる。 | 引数には配列を指定する。選択された要素のインデックスが返り値になる。 | ||
=== 使い方 === | === 使い方 === | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = ["Morning","Afternoon","Evening"]; | var menu = ["Morning","Afternoon","Evening"]; | ||
var value = ["あんぱん","ジャムパン","カレーパン"]; | var value = ["あんぱん","ジャムパン","カレーパン"]; | ||
Document.Write(value[ShowMenuMini(menu) ] ); | Document.Write(value[ShowMenuMini(menu) ] ); | ||
</ | </syntaxhighlight> | ||
なお、セパレーターを挿入する機能はオフにしてあります。セパレータを使いたい場合は8行目のコメントアウトを外してください。その場合はメニュの表示と返り値がずれることに注意してください。 | なお、セパレーターを挿入する機能はオフにしてあります。セパレータを使いたい場合は8行目のコメントアウトを外してください。その場合はメニュの表示と返り値がずれることに注意してください。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = ["Morning","Afternoon","----","Evening"]; | var menu = ["Morning","Afternoon","----","Evening"]; | ||
var value = ["あんぱん","ジャムパン","ここが選ばれることはない","カレーパン"]; | var value = ["あんぱん","ジャムパン","ここが選ばれることはない","カレーパン"]; | ||
Document.Write(value[ShowMemuMini(menu) ] ); | Document.Write(value[ShowMemuMini(menu) ] ); | ||
</ | </syntaxhighlight> | ||
2023年5月16日 (火) 23:29時点における版
マクロではないのですが、Meryのポップアップメニューを手軽に扱える関数を書いてみました。
function ShowPopupMenu(menu_obj, position, separator, esc){
var MAX_NEST = 5;//ネストの最大深度
var id_counter = 1;
var item_list = [];
var popup
var selected_id;
//メニューをESCキーで閉じた時の挙動を登録
if(esc === undefined){
item_list[0] = function(){Quit();};
}
else{
item_list[0] = esc;
}
//メニュー位置の初期化
if(position !== mePosMouse) {
position = 0;
}
//セパレーターを挿入する条件
var isSeparator = function(str){
if(separator === false){
return false;
}
else if(typeof separator === "string"){
return (str.indexOf(separator) !== -1);
}
else{
return (str.indexOf("----") !== -1);
}
};
var ObjectOrArray = function(target){
if(target){
switch(Object.prototype.toString.call(target) ){
case "[object Object]":
return "Object";
break;
case "[object Array]":
return "Array";
break;
default:
return "Other";
break;
}
}
else{
return "Other";
}
};
var ArrayToPopup = function(list){
var menu = CreatePopupMenu();
for(var i =0; i < list.length; i++){
if(isSeparator(list[i].toString() ) ){
menu.Add("dummy", 999, meMenuSeparator);
}
else{
menu.Add(list[i].toString(), i + 1);
}
item_list[i + 1] = list[i];
}
return menu;
};
var ObjectToPopup = function(obj, nest){
var menu = CreatePopupMenu();
for(var key in obj){
if(isSeparator(key) ){
menu.Add("dummy", 999, meMenuSeparator);
}
else{
if(ObjectOrArray(obj[key] ) !== "Object"){
menu.Add(key, id_counter);
item_list[id_counter] = obj[key];
id_counter++;
}
else{
if(nest < MAX_NEST){
menu.AddPopup(key, ObjectToPopup(obj[key], nest + 1) );
}
}
}
}
return menu;
};
//ここまで変数、関数の定義
//関数の本体はここから
switch(ObjectOrArray(menu_obj) ){
case "Object":
popup = ObjectToPopup(menu_obj, 0);
break;
case "Array":
popup = ArrayToPopup(menu_obj);
break;
default://第1引数が配列かオブジェクト以外の時
throw new Error("第1引数には配列またはオブジェクトを指定してください");
break;
}
selected_id = popup.Track(position);
if(typeof(item_list[selected_id] ) === "function"){
return item_list[selected_id]();
}
else{
return item_list[selected_id];
}
}
簡単な使い方
var x = ShowPopupMenu(["Spring","Summer","Autumn","Winter"] );
Document.Write(x);
選択された文字列が挿入されます。
リファレンス
function ShowPopupMenu(
menu_obj : Object | Array,
position : int,
separator : Boolean | String,
esc : Anything
)
返り値 : 選択されたメニューに対応する値。後述。
menu_obj : 必ず指定する。メニューを定義したオブジェクトまたは配列。
position : 省略可能。メニューを表示する位置。mePosMouseを指定するとカーソル位置に表示される。
serarator : 省略可能。セパレーターを挿入する条件。後述。
esc : 省略可能。ESCキーでメニューを閉じた時の挙動。後述。
使い方
配列を指定する場合
第1引数に配列を指定するとその配列内の要素をメニューに表示します。
var list = ["メニュー1","メニュー2","メニュー3","メニュー4"]
SowPopupMenu関数の返り値は選択された要素になります。
オブジェクトを指定する場合
オブジェクトのキーがメニューに表示ます。キーに対応する値が返り値になります。(値が関数オブジェクトの時は後述。)
var menu = {};
menu["メニュー1"] = "メニュー1";
menu["メニュー2"] = 2;
こうするとサブメニューを作れます。
menu["グループ1"] = {};
menu["グループ1"]["サブメニュー1"] = "SubMenu1";
連続したハイフン4つ(----)をキー内に含む場合セパレータになります。
menu["----"] = 0; //何らかの値を入れておく。
list = ["menu1","menu----2","menu3"] //配列でも可能。
使用例
var menu = {};
menu["メニュー1"] = "メニュー1";
menu["メニュー2"] = 2;
menu["グループ1"] = {};
menu["グループ1"]["サブメニュー1"] = "SubMenu1";
menu["グループ1"]["----"] = 0;
menu["グループ1"]["サブメニュー2"] = "Submenu2";
このように指定することも可能です。
var menu = {
"メニュー1" : "メニュー1",
"メニュー2" : 2,
"グループ1" : {
"サブメニュー1" : "SubMenu1",
"----" : 0,
"サブメニュー2" : "SubMenu2"
}
}
返り値
オブジェクトでメニューを定義するする場合、値が関数オブジェクトかそれ以外かで返り値が変わります。 関数オブジェクトを指定するとその関数を実行して、その関数の返り値がShowPopupMenu関数の返り値になります。
function func1(){
Document.Write("func1");
return 0;
}
var menu = {};
menu["func1"] = func1; // func1() 、ではない。(括弧は付けない)
「func1」がエディターのキャレット位置に挿入され、0が返ります。
もちろんfunctionリテラルで直接書いてもかまいません。
menu["func2"] = function(){Alert("func2");};
関数オブジェクト以外を値とした場合はその値がそのまま返ります。
その他の引数の説明
第2引数にmePosMouseを指定するとマウスカーソルの位置にメニューが表示されます。
ShowPopupMenu(menu, mePosMouse)
それ以外の値の時はキャレット位置に表示します。
第3引数にfalseを指定するとセパレーターを挿入しなくなります。また文字列を指定するとその文字列が含まれるメニューをセパレータにします。それ以外の値は無視します。
ShowPopupMenu(menu,0,false) // セパレーターを挿入しない
ShowPopupMenu(menu,0,"ああああ") // 「ああああ」が含まれるメニューをセパレータにします。
第4引数でメニューをESCキーで閉じた時の挙動を変更できます。デフォルトではそこでスクリプトの実行が終了します。 関数オブジェクトを指定するとその関数を実行し、それ以外の値(undefinedを除く)の場合はその値を返します。
ShowPopupMenu(menu,0,0,-1)
上の例ではESCキーを押してもスクリプトは終了せず、関数は-1を返します。
その他
デフォルトではメニューの最大階層は5(2行目のMAX_NESTの値を書き換えることで変更可能)になっています。これは
var menu = {};
menu["メニュー1"] = 1;
menu["グループ1"] = menu;
といった再帰定義で無限ループになるのを防ぐためです。
Tips
menu["Now?"] = new Date();
こう書くとマクロを実行したとき(正確にはオブジェクトに代入した瞬間)の時間になります。これをメニューが選択された時の時間にするときは
menu["Now!!"] = function(){return new Date();};
こうやってfunctionでくるんでください。
おまけ
サブメニューとかいいから簡単に使いたいという人向け。
function ShowMenuMini(list){
var pos = 0;
var ret = 0;
var menu = CreatePopupMenu();
for(i = 0;i < list.length;i++){
//if(list[i].toString().indexOf("----") !== -1){menu.Add("hoge",999,meMenuSeparator);continue;}
menu.Add(list[i].toString(),i + 1);
}
ret = menu.Track(pos);
if(ret === 0){
Quit(); //ESCキーを押した時の挙動
}
else{
return ret - 1;
}
}
リファレンス
function ShowMenuMini(
list : Array
)
引数には配列を指定する。選択された要素のインデックスが返り値になる。
使い方
var menu = ["Morning","Afternoon","Evening"];
var value = ["あんぱん","ジャムパン","カレーパン"];
Document.Write(value[ShowMenuMini(menu) ] );
なお、セパレーターを挿入する機能はオフにしてあります。セパレータを使いたい場合は8行目のコメントアウトを外してください。その場合はメニュの表示と返り値がずれることに注意してください。
var menu = ["Morning","Afternoon","----","Evening"];
var value = ["あんぱん","ジャムパン","ここが選ばれることはない","カレーパン"];
Document.Write(value[ShowMemuMini(menu) ] );