「
ポップアップメニューを手軽に扱う
」を編集中
2025年6月30日 (月) 01:23時点における
MSY-07
(
トーク
|
投稿記録
)
による版
(SyntaxHighlightにcopyの追加)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
マクロではないのですが、Meryのポップアップメニューを手軽に扱える関数を書いてみました。 == ソースコード == <syntaxhighlight lang="javascript" copy> 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]; } } </syntaxhighlight> == 簡単な使い方 == <syntaxhighlight lang="javascript"> var x = ShowPopupMenu(["Spring","Summer","Autumn","Winter"] ); Document.Write(x); </syntaxhighlight> 選択された文字列が挿入されます。 == リファレンス == <syntaxhighlight lang="javascript"> function ShowPopupMenu( menu_obj : Object | Array, position : int, separator : Boolean | String, esc : Anything ) </syntaxhighlight> '''返り値''' : 選択されたメニューに対応する値。後述。 '''menu_obj''' : 必ず指定する。メニューを定義したオブジェクトまたは配列。 '''position''' : 省略可能。メニューを表示する位置。mePosMouseを指定するとカーソル位置に表示される。 '''serarator''' : 省略可能。セパレーターを挿入する条件。後述。 '''esc''' : 省略可能。ESCキーでメニューを閉じた時の挙動。後述。 == 使い方 == === 配列を指定する場合 === 第1引数に配列を指定するとその配列内の要素をメニューに表示します。 <syntaxhighlight lang="javascript"> var list = ["メニュー1","メニュー2","メニュー3","メニュー4"] </syntaxhighlight> SowPopupMenu関数の返り値は選択された要素になります。 === オブジェクトを指定する場合 === オブジェクトのキーがメニューに表示ます。キーに対応する値が返り値になります。(値が関数オブジェクトの時は後述。) <syntaxhighlight lang="javascript"> var menu = {}; menu["メニュー1"] = "メニュー1"; menu["メニュー2"] = 2; </syntaxhighlight> こうするとサブメニューを作れます。 <syntaxhighlight lang="javascript"> menu["グループ1"] = {}; menu["グループ1"]["サブメニュー1"] = "SubMenu1"; </syntaxhighlight> 連続したハイフン4つ(----)をキー内に含む場合セパレータになります。 <syntaxhighlight lang="javascript"> menu["----"] = 0; //何らかの値を入れておく。 list = ["menu1","menu----2","menu3"] //配列でも可能。 </syntaxhighlight> === 使用例 === <syntaxhighlight lang="javascript"> var menu = {}; menu["メニュー1"] = "メニュー1"; menu["メニュー2"] = 2; menu["グループ1"] = {}; menu["グループ1"]["サブメニュー1"] = "SubMenu1"; menu["グループ1"]["----"] = 0; menu["グループ1"]["サブメニュー2"] = "Submenu2"; </syntaxhighlight> このように指定することも可能です。 <syntaxhighlight lang="javascript"> var menu = { "メニュー1" : "メニュー1", "メニュー2" : 2, "グループ1" : { "サブメニュー1" : "SubMenu1", "----" : 0, "サブメニュー2" : "SubMenu2" } } </syntaxhighlight> === 返り値 === オブジェクトでメニューを定義するする場合、値が関数オブジェクトかそれ以外かで返り値が変わります。 関数オブジェクトを指定するとその関数を実行して、その関数の返り値がShowPopupMenu関数の返り値になります。 <syntaxhighlight lang="javascript"> function func1(){ Document.Write("func1"); return 0; } var menu = {}; menu["func1"] = func1; // func1() 、ではない。(括弧は付けない) </syntaxhighlight> 「func1」がエディターのキャレット位置に挿入され、0が返ります。 もちろんfunctionリテラルで直接書いてもかまいません。 <syntaxhighlight lang="javascript"> menu["func2"] = function(){Alert("func2");}; </syntaxhighlight> 関数オブジェクト以外を値とした場合はその値がそのまま返ります。 === その他の引数の説明 === 第2引数にmePosMouseを指定するとマウスカーソルの位置にメニューが表示されます。 <syntaxhighlight lang="javascript"> ShowPopupMenu(menu, mePosMouse) </syntaxhighlight> それ以外の値の時はキャレット位置に表示します。 第3引数にfalseを指定するとセパレーターを挿入しなくなります。また文字列を指定するとその文字列が含まれるメニューをセパレータにします。それ以外の値は無視します。 <syntaxhighlight lang="javascript"> ShowPopupMenu(menu,0,false) // セパレーターを挿入しない ShowPopupMenu(menu,0,"ああああ") // 「ああああ」が含まれるメニューをセパレータにします。 </syntaxhighlight> 第4引数でメニューをESCキーで閉じた時の挙動を変更できます。デフォルトではそこでスクリプトの実行が終了します。 関数オブジェクトを指定するとその関数を実行し、それ以外の値(undefinedを除く)の場合はその値を返します。 <syntaxhighlight lang="javascript"> ShowPopupMenu(menu,0,0,-1) </syntaxhighlight> 上の例ではESCキーを押してもスクリプトは終了せず、関数は-1を返します。 === その他 === デフォルトではメニューの最大階層は5(2行目のMAX_NESTの値を書き換えることで変更可能)になっています。これは <syntaxhighlight lang="javascript"> var menu = {}; menu["メニュー1"] = 1; menu["グループ1"] = menu; </syntaxhighlight> といった再帰定義で無限ループになるのを防ぐためです。 === Tips === <syntaxhighlight lang="javascript"> menu["Now?"] = new Date(); </syntaxhighlight> こう書くとマクロを実行したとき(正確にはオブジェクトに代入した瞬間)の時間になります。これをメニューが選択された時の時間にするときは <syntaxhighlight lang="javascript"> menu["Now!!"] = function(){return new Date();}; </syntaxhighlight> こうやってfunctionでくるんでください。 == おまけ == サブメニューとかいいから簡単に使いたいという人向け。 <syntaxhighlight lang="javascript" copy> 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; } } </syntaxhighlight> === リファレンス === <syntaxhighlight lang="javascript"> function ShowMenuMini( list : Array ) </syntaxhighlight> 引数には配列を指定する。選択された要素のインデックスが返り値になる。 === 使い方 === <syntaxhighlight lang="javascript"> var menu = ["Morning","Afternoon","Evening"]; var value = ["あんぱん","ジャムパン","カレーパン"]; Document.Write(value[ShowMenuMini(menu) ] ); </syntaxhighlight> なお、セパレーターを挿入する機能はオフにしてあります。セパレータを使いたい場合は8行目のコメントアウトを外してください。その場合はメニュの表示と返り値がずれることに注意してください。 <syntaxhighlight lang="javascript"> var menu = ["Morning","Afternoon","----","Evening"]; var value = ["あんぱん","ジャムパン","ここが選ばれることはない","カレーパン"]; Document.Write(value[ShowMemuMini(menu) ] ); </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク