ポップアップメニューでラジオボタン

提供: MeryWiki
移動先: 案内検索

概要[編集]

ポップアップメニューを使ったラジオボタン(のようなもの)です。

機能[編集]

  • 選択項目は、{ items :["項目1","項目2","項目3"], selected : 数値(初期インデックス) }という連想配列の配列で与えてください。配列の要素が一つの選択グループです。
  • 返り値も、連想配列の配列です。
  • キャンセルしたときの返り値は、与えた連想配列です。
  • 予め連想配列を変数にしておいた方が使いやすいと思います。

履歴[編集]

  • 2014/01/26 初版

コード[編集]

// radiobtn.js
// 2014/01/26
 
var orientation = { items:["landscape","portrait"] , selected:1 };
var paper = { items:["A4","B5","letter"] , selected:0 };
var printer = { items:["pdf","EPSON","CANON","OKI","other"] , selected:0 };
 
// 使用方法その1
var ret = radiobtn( [ printer, paper, orientation ] );
for ( var i = 0; i < ret.length; i++ ){
  Alert( ret[ i ].items[ ret[ i ].selected ] );
}
 
// 使用方法その2
radiobtn( [ printer, paper, orientation ] );
Alert( printer.items[ printer.selected ] );
Alert( paper.items[ paper.selected ] );
Alert( orientation.items[ orientation.selected ] );
 
 
function radiobtn( arg1 ){
  var menuitems = arg1;
  var off = 5, selcan = 0, selok = 1;
 
  // 初期値の保存
  for ( var i = 0; i < menuitems.length; i++ ){
    menuitems[ i ].initial = menuitems[ i ].selected;
  }
 
  var r = 0;
  while( r >= 0 ){
    r = showPopupMenu();
    switch ( r ){
    case selcan - off:
      for ( var i = 0; i < menuitems.length; i++ ){
        menuitems[ i ].selected = menuitems[ i ].initial;
      }
      return menuitems;
    case selok - off:
      return menuitems;
    default :
      var i = 0;
      while( r > menuitems[ i ].items.length - 1 ){
        r = r - menuitems[ i ].items.length;
        i++;
      }
      menuitems[ i ].selected = r;
    }
  }
 
  function showPopupMenu(){
    var menu = CreatePopupMenu();
    var idx = 0;
    for ( var i = 0; i < menuitems.length; i++ ){
      var submenu = CreatePopupMenu();
      menu.AddPopup( menuitems[ i ].items[ menuitems[ i ].selected ], submenu );
      for ( var k = 0; k < menuitems[ i ].items.length; k++ ){
        submenu.Add(  menuitems[ i ].items[ k ] , idx + off, 0 );
        idx++;
      }
    }
    menu.Add( "---", 0, meMenuSeparator );
    menu.Add( "キャンセル", selcan, 0 );
    menu.Add( "選択終了", selok, 0 );
    return menu.track( 0 ) - off;
  }
}

その他[編集]

  • おかしなところがあったら教えてください。