「ポップアップメニューでチェックボックス」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし |
編集の要約なし |
||
| 30行目: | 30行目: | ||
show : function(){ | show : function(){ | ||
var off = 5; | var off = 5; | ||
var r = 0; | var r = 0, selcan = 0, selok = 1; | ||
while( r >= 0 ){ | while( r >= 0 ){ | ||
r = showPopupMenu( this ); | r = showPopupMenu( this ); | ||
switch ( r ){ | |||
case selcan - off: | |||
return {}; | return {}; | ||
case selok - off: | |||
return this.menuitem; | return this.menuitem; | ||
default : | |||
this.menuitem[ this.index[r] ] = !this.menuitem[ this.index[r] ]; | this.menuitem[ this.index[ r ] ] = !this.menuitem[ this.index[ r ] ]; | ||
}; | }; | ||
} | } | ||
| 51行目: | 53行目: | ||
} | } | ||
menu.Add( "---", 0, meMenuSeparator ); | menu.Add( "---", 0, meMenuSeparator ); | ||
menu.Add( "キャンセル", | menu.Add( "キャンセル", selcan, 0 ); | ||
menu.Add( "選択終了", | menu.Add( "選択終了", selok, 0 ); | ||
return menu.track( 0 ) - off; | return menu.track( 0 ) - off; | ||
} | } | ||
| 64行目: | 66行目: | ||
}; | }; | ||
var r = chkbox1.show(); | var r = chkbox1.show(); | ||
for ( var i in r ){ | for ( var i in r ){ | ||
Alert( i + " -> " + r[ i ] ); | Alert( i + " -> " + r[ i ] ); | ||
}; | }; | ||
</source> | </source> | ||
<br /> | <br /> | ||
| 84行目: | 87行目: | ||
var index = []; | var index = []; | ||
var off = 5; | var off = 5; | ||
var r = 0; | var r = 0, selcan = 0, selok = 1; | ||
while( r >= 0 ){ | while( r >= 0 ){ | ||
r = showPopupMenu(); | r = showPopupMenu(); | ||
switch ( r ){ | |||
case selcan - off: | |||
return {}; | return {}; | ||
case selok - off: | |||
return menuitem; | return menuitem; | ||
default : | |||
menuitem[ index[r] ] = !menuitem[ index[r] ]; | menuitem[ index[ r ] ] = !menuitem[ index[ r ] ]; | ||
} | } | ||
} | } | ||
| 106行目: | 110行目: | ||
} | } | ||
menu.Add( "---", 0, meMenuSeparator ); | menu.Add( "---", 0, meMenuSeparator ); | ||
menu.Add( "キャンセル", | menu.Add( "キャンセル", selcan, 0 ); | ||
menu.Add( "選択終了", | menu.Add( "選択終了", selok, 0 ); | ||
return menu.track( 0 ) - off; | return menu.track( 0 ) - off; | ||
} | } | ||
2014年1月26日 (日) 10:41時点における版
概要
ポップアップメニューを使ったチェックボックス(のようなもの)です。
機能
- 選択項目は、{ "項目名" : boolean }という形の連想配列で与えてください。
trueで与えると最初からチェックされます。 - 返り値も、連想配列です。
- キャンセルしたときの返り値は、空の連想配列です。
履歴
- 20140125 初版
- 20140126 初期値を与えられるようにした。関数バージョンを追加した。
コード
- オブジェクトバージョン
// chkbox.js
// 2014/01/25/
CheckBox = function(){
this.initialize.apply( this, arguments );
}
CheckBox.prototype = {
menuitem : "アイテム(連想配列)", // { key : boolean, …… }
index : "メニューに表示された順序",
initialize : function( arg1 ){
this.menuitem = arg1;
this.index = [];
},
show : function(){
var off = 5;
var r = 0, selcan = 0, selok = 1;
while( r >= 0 ){
r = showPopupMenu( this );
switch ( r ){
case selcan - off:
return {};
case selok - off:
return this.menuitem;
default :
this.menuitem[ this.index[ r ] ] = !this.menuitem[ this.index[ r ] ];
};
}
function showPopupMenu( obj ){
var menu = CreatePopupMenu();
var i = 0;
for ( var key in obj.menuitem ){
menu.Add( key , i + off, ( obj.menuitem[ key ] )? meMenuChecked : 0 );
obj.index.push( key );
i++;
}
menu.Add( "---", 0, meMenuSeparator );
menu.Add( "キャンセル", selcan, 0 );
menu.Add( "選択終了", selok, 0 );
return menu.track( 0 ) - off;
}
}
}
var chkbox1 = new CheckBox( { "a":true, "b":false, "c":false, "d":false } );
var r = chkbox1.show();
for ( var i in r ){
Alert( i + " -> " + r[ i ] );
};
var r = chkbox1.show();
for ( var i in r ){
Alert( i + " -> " + r[ i ] );
};
- 関数バージョン
// chkbox2.js
// 2014/01/26/
var r = CheckBox( { "a":true, "b":false, "c":false, "d":false } );
for ( var i in r ){
Alert( i + " -> " + r[ i ] );
};
function CheckBox( arg1 ){
var menuitem = arg1;
var index = [];
var off = 5;
var r = 0, selcan = 0, selok = 1;
while( r >= 0 ){
r = showPopupMenu();
switch ( r ){
case selcan - off:
return {};
case selok - off:
return menuitem;
default :
menuitem[ index[ r ] ] = !menuitem[ index[ r ] ];
}
}
function showPopupMenu(){
var menu = CreatePopupMenu();
var i = 0;
for ( var key in menuitem ){
menu.Add( key , i + off, ( menuitem[ key ] )? meMenuChecked : 0 );
index.push( key );
i++;
}
menu.Add( "---", 0, meMenuSeparator );
menu.Add( "キャンセル", selcan, 0 );
menu.Add( "選択終了", selok, 0 );
return menu.track( 0 ) - off;
}
}
その他
おかしい箇所やもっといい方法があったら教えてください。
スポンサーリンク