「ポップアップメニューでチェックボックス」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
手石 (トーク | 投稿記録)
ページの作成:「= 概要 = ポップアップメニューでチェックボックスのような動作を実現します。 = 利用方法 = * 選択項目は配列で与えてくだ...」
 
手石 (トーク | 投稿記録)
編集の要約なし
1行目: 1行目:
= 概要 =
= 概要 =
ポップアップメニューでチェックボックスのような動作を実現します。
ポップアップメニューを使ったチェックボックス(のようなもの)です。


= 利用方法 =
= 機能 =
* 選択項目は配列で与えてください。
* 選択項目は、{ "項目名" : boolean }という形の連想配列で与えてください。<br />trueで与えると最初からチェックされます。
* 返り値は、同じ長さの配列です。
* 返り値も、連想配列です。
* 非選択の項目のインデックスにゼロが入ってます。選択項目は、meMenuCheckedの数値です。
* キャンセルしたときの返り値は、空の連想配列です。
* キャンセルしたときの返り値は、空配列です。
 
= 履歴 =
* 20140125 初版
* 20140126 初期値を与えられるように変更


= コード =
= コード =
18行目: 21行目:


CheckBox.prototype = {
CheckBox.prototype = {
   menuitem : "アイテムの配列",
   menuitem : "アイテム(連想配列)", // { key : boolean, …… }
   selected : "アイテム選択状況の配列、非選択が0",
   index : "メニューに表示された順序",
   initialize : function( arg1 ){
   initialize : function( arg1 ){
     this.menuitem = arg1;
     this.menuitem = arg1;
     this.selected = [];
     this.index = [];
    for ( var i = 0; i < this.menuitem.length; i++ ){
      this.selected.push( 0 );
    }
   },
   },
   show : function(){
   show : function(){
33行目: 33行目:
       r = showPopupMenu( this );
       r = showPopupMenu( this );
       if ( r == 0 - off ){
       if ( r == 0 - off ){
//        Alert( "キャンセルされました。" );
         return {};
         return [];
       } else if ( r == 1 - off ){
       } else if ( r == 1 - off ){
         return this.selected;
         return this.menuitem;
       } else {
       } else {
         this.selected[ r ] = ( this.selected[ r ] == 0 ) ? meMenuChecked : 0;
         this.menuitem[ this.index[r] ] = !this.menuitem[ this.index[r] ];
       };
       };
     }
     }
44行目: 43行目:
     function showPopupMenu( obj ){
     function showPopupMenu( obj ){
       var menu = CreatePopupMenu();
       var menu = CreatePopupMenu();
       for ( var i = 0; i < obj.menuitem.length; i++ ){
       var i = 0;
         menu.Add( obj.menuitem[ i ] , i + off, obj.selected[ i ] );
      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( "---", 0, meMenuSeparator );
55行目: 57行目:
}
}


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 ] );
};
</source>


var chkbox1 = new CheckBox( [ "a", "b", "c", "d" ] );
Alert( chkbox1.show() );
</source>
= その他 =
= その他 =
おかしい箇所やもっといい方法があったら教えてください。
おかしい箇所やもっといい方法があったら教えてください。<br />

2014年1月26日 (日) 09:45時点における版

概要

ポップアップメニューを使ったチェックボックス(のようなもの)です。

機能

  • 選択項目は、{ "項目名" : 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;
    while( r >= 0 ){
      r = showPopupMenu( this );
      if ( r == 0 - off ){
        return {};
      } else if ( r == 1 - off ){
        return this.menuitem;
      } else {
        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( "キャンセル", 0, 0 );
      menu.Add( "選択終了", 1, 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 ] );
};

その他

おかしい箇所やもっといい方法があったら教えてください。

スポンサーリンク