ループ内でボタンを生成するには?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />ループ内でボタンを生成しようとしています (各列に 1 つのボタン)。 ボタンがスクリプトを実行するとき、作成時にボタン ボックス オブジェクトに渡されたスクリプトではなく、最後に作成されたボタンのスクリプトが常に実行されることを除いて、ボタンは正しく作成されます。
そのため、ボタンはスクリプトへの参照のみを取得するようです。スクリプトが変更されると、ボタンの機能が変更されます。 スクリプトの配列で回避策を検討してみましたが、問題は、ボタン オブジェクトに引数を渡すことができないことです (たとえば、配列内のどのスクリプトを実行するかをインデックス付けします)。
質問:異なるスクリプト/動作でループ内にボタンを作成できるjslの方法はありますか? たとえば、作成時にボタンオブジェクトに引数/データを渡す方法はありますか???
私のコード:
NamesDefaultToHere(1);
dt = 現在のデータ テーブル();
dtCols = dt << Get Column Names( Numeric, Continuous );
// strParam の分布表示式
Expr_ShowDistribution = Expr(
New Window( Char(strParam),
分布(
連続配信(
Column( strParam ) //パラメータを指定します
)、
SendToReport(
Dispatch( {}, "配布", OutlineBox, Set Title( "" ) ),
)
)
)
);
// メイン ウィンドウ
New Window("メインウィンドウ",
ob = OutlineBox("ボタン",
TextBox("デバッグ ボタン", Set Font Style("Bold"))
);
);
// ログに出力するだけのボタンを作成
BB = Button Box( "ClickMe", Show("Clicked"));
ob << 追加 (BB);
// ディストリビューションを表示するためのボタンを作成します
For( i = 1, i <= NItems(dtCols), i++,
Expr_ButtonAction = Substitute(NameExpr(Expr_ShowDistribution),
Expr(strParam)、Eval(Char(dtCols) )));
Show(NameExpr(Expr_ButtonAction)); // ボタンごとに表現が異なります。
BB = ボタン ボックス( Char(dtCols ), Eval(Expr_ButtonAction));
ob << 追加 (BB);
);
Re: ループ内でボタンを生成するには?あなたの例は、ループ内の最後の2行、つまり
BB =ボタンボックス(シャア( dtCols [私])) 、評価( Expr_ButtonAction ))) ;
オブ<<追加( BB ) ;
に置き換えられます
評価(評価式(オブ<<追加(ボタンボックス(シャア( dtCols [私] ) 、式(名前Expr ( Expr_ButtonAction ) ) ) ) ) ) ;
最も明白な解決策ではありません。 ここでは、PMroz の例のような「文字列操作」アプローチの方が簡単だと思います。
Re: ループ内でボタンを生成するには?良いアイデアですが、実装されていません。今のところ、ボタンの名前を連想配列のキーとして使用することをお勧めします。
Re: ループ内でボタンを生成するには?の関数の設定()キーと値のペアを連想配列に追加するなどして、ユーザーデータをボタンに添付できれば、このアプローチはより便利に思えます。それは可能ですか?
Re: ループ内でボタンを生成するには?ボタン スクリプトは、ボタンを参照する「this」パラメーターを持つ関数にすることができます。これは、ボタンがその名前またはその親ボックスを見つけることができることを意味します。
New Window( "例", v = V List Box() );
f = Function( {this}, Show( this << getbuttonname ) );
For( i = 1, i < 10, i++,
v << append( Button Box( "number " || Char( i ), Set Function( f ) ) )
);

「Set Function」パラメーターは、これを機能させるための鍵です。あなたの例では、ボタン名は列名であると思います。この例の VListBox には「v」という名前が付けられているため、ボタン ボックスを追加できます。
Re: ループ内でボタンを生成するには?これが機能する実装です。分布式を関数に変更し、それを機能させるために evalinsert、parse、eval をいじる必要がありました。
表示分布=関数({ column_name } 、 {デフォルトのローカル} 、
dist_expr =エバリンサート(
"\[分布( 名義分布( 列(:名前("^列名^")) ) )]\" ) ;
評価(解析する( dist_expr ))) ;
) ;
// メイン ウィンドウ
新しい窓( 「メインウィンドウ」 、
オブ=アウトラインボックス( 「ボタン」 、
テキストボックス( 「デバッグボタン」 、フォント スタイルの設定( "大胆な" )))
) ;
) ;
// ログに出力するだけのボタンを作成
BB =ボタンボックス( 「クリックミー」 、見せる( 「クリックされた」 ))) ;
オブ<<追加( BB ) ;
dt =開ける( "$sample_data\Big Class.jmp" ) ;
dtcols = dt <<列名を取得する(弦) ;
ために(私= 1 、私<=アイテム( dtcols ) 、私++、
button_expr =エバリンサート( "\[one_button = ボタン ボックス("^dtcols ^", showdistribution("^dtcols ^"))]\" ) ;
評価(解析する( button_expr ))) ;
オブ<<追加(ワンボタン) ;
) ;