<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />このクエリは、JMP 9 の機能をより有効に活用するためにいくつかのスクリプトをアップグレードするという私の以前のクエリに関連しています ( http://communities.sas.com/message/109908#109908 )、しかし、まったく同じ問題ではないと思います。基本的に、これはすでに選択が行われたリスト ボックスを含むウィンドウの再描画に関係します。次の簡略化された例では、リスト A から選択を行ってから、リスト A が表示されるウィンドウを再作成し、その内容が A での選択に応じた 2 番目のリスト ボックス (リスト ボックス
を表示します。ユーザーがリスト ボックス B から選択すると、その下のテキスト ボックスに最終的な選択内容が表示されます。リスト ボックス A から選択が行われた場合、新しい選択肢のリストがリスト ボックス B に提供され、ユーザーはそこから最終選択を行う必要があります。これを JMP 8 で実行すると期待通りに動作しますが、JMP 9 で実行すると無限ループが作成されます。理由がわかると思います。コメントでマークした行 (リスト ボックス A と B の両方がウィンドウに表示されるときに、リスト ボックス A で行われた選択を "<< set selected" プロパティで強調表示します) が割り当てを処理します。あたかもクリックしてその選択を行ったかのように、それに応じて動作します。もちろん、この行を削除することもできますが、そうすると、ユーザーはリスト ボックスから最終的な選択に至るまでのパスを見ることができなくなり、そうする必要があります。あるいは、単純に最初からウィンドウにすべてのリスト ボックスを含めて、ウィンドウをまったく再描画しないこともできますが、これの実際のバージョンでは、ユーザーは最初に使用するリスト ボックスの数がわかりません。そして実際に必要以上のものを一度に画面に表示したくありません。
リスト_A = { 「アンディ」 、 「ベッシー」 、 "キャリー" 、 「ダヴィナ」 、 「エディ」 } ;
リスト_B = {} ;
Expr_Redraw_NW =式(
リストボックス_A =リストボックス(リスト_A 、評価( Expr_Create_List_B )) ;
北西=新しい窓( "新しい窓" 、
Hリストボックス(
パネルボックス( "最初に選んだ" 、リストボックス_A ) 、
もし(選択> 0 、
パネルボックス( "第二希望" 、
リストボックス_B 、
テキストボックス( 「」 ) 、
テキストボックス_回答=テキストボックス( 「」 )
)
)
)
) ;
もし(選択> 0 、リストボックス_A <<選択されたセット(選択)) ; // この行が問題の原因となります。
北西<<ウィンドウを移動する( 200 、 200 ) ;
) ;
Expr_Create_List_B =式(
プレフィックス= (リストボックス_A <<選ばれる)[ 1 】 ;
見せる(プレフィックス) ;
選択= (リストボックス_A <<選択したインデックスを取得する)[ 1 】 ;
見せる(選択) ;
リスト_B = {} ;
のために(私= 1 、私<= 5 、私++、
に挿入する(リスト_B 、プレフィックス|| 「」 ||チャー(私))
) ;
リストボックス_B =リストボックス(リスト_B 、
B_選択= (リストボックス_B <<選ばれる)[ 1 】 ;
テキストボックス_回答<<テキストを設定する( 「選択内容は次のとおりです。」 || B_選択) ;
北西<<再上映
) ;
北西<<ウィンドウを閉じる;
評価( Expr_Redraw_NW ) ;
) ;
リストボックス_B =リストボックス(リスト_B 、印刷する( 「」 )) ;
テキストボックス_回答=テキストボックス( 「」 ) ;
答え= 「」 ;
選択= 0 ;
評価( Expr_Redraw_NW ) ;
仕組みを大幅に再構築することなく、この状況から抜け出す簡単な方法を誰かが考えられるでしょうか?3 つまたは 4 つのスクリプトで同様の問題が発生しているため、可能であれば修正作業を最小限に抑えたいと考えています。
ご支援いただきまして誠にありがとうございました。
非常に簡単な解決策は見つかりませんでした。再帰の罠に陥るリスクを排除する 1 つの方法は、キー式間で一方向の通信を行うことです。
以下は、ウィンドウ全体を再描画する代わりに、List_Box_B を含むパネル ボックスを条件付きで削除/追加する例です。したがって、List Box A を更新する必要はなく、すべての再描画作業は、Expr_Create_List_B からの「フィードバック」なしで List_Box_A のスクリプトから呼び出されます。期待したほど単純ではないかもしれませんが、JMP9 では機能するようです。
List_A = { "アンディ" , 「ベッシー」 、 "キャリー" 、 「ダヴィナ」 、 「エディ」 } ;
リスト_B = {} ;
Expr_Redraw_NW =エクスプレ(
List_Box_A =リストボックス(
リスト_A 、
Expr_Create_List_Bを評価します。
( Panel_Box_B << delete ) を試してください。
( A_Choice > 0 の場合、
HL << Append ( Eval ( Expr_Panel_Box_B ) ) ;
A_選択= 0 ; // コントロールクリックで選択範囲をリセットできるようにする
);
);
( A_Choice == 0 の場合、
北西= 新しいウィンドウ( 「新しいウィンドウ」 、
HL = H リストボックス(
パネルボックス( 「最初の選択」 、 List_Box_A ) 、
( A_Choice > 0 の場合、
評価( Expr_Panel_Box_B )
)
)
)
);
NW <<ウィンドウ( 200 , 200 )を移動します。
);
Expr_Create_List_B =エクスプレ(
試す(
プレフィックス= ( List_Box_A <<選択される)[ 1 ] ;
表示(プレフィックス) ;
A_Choice = ( List_Box_A <<選択されたインデックスを取得)[ 1 ] ;
表示( A_Choice ) ;
リスト_B = {} ;
( i = 1 , i <= 5 , i ++ , )の場合、
挿入( List_B 、プレフィックス|| " " || Char ( i ) )
);
List_Box_B =リストボックス(
リスト_B 、
B_Choice = ( List_Box_B <<選択される)[ 1 ] ;
TextBox_Answer << set text ( "選択範囲は: " || B_Choice ) ;
NW <<再表示
);
);
);
Expr_Panel_Box_B =エクスプレ(
Panel_Box_B =パネルボックス( 「第2の選択肢」 、
リストボックスB 、
テキストボックス( " " ) 、
TextBox_Answer =テキストボックス( "" )
)
);
List_Box_B =リストボックス( List_B 、 Print ( "" ) ) ;
TextBox_Answer =テキストボックス( "" ) ;
回答= "" ;
A_Choice = 0 ;
評価( Expr_Redraw_NW ) ;
素晴らしい!まさにその通りです。問題を非常にうまく解決してくれるだけでなく、このようなクエリの連鎖を処理するようにプロセスを拡張する方法も示唆してくれています。本当にありがとうございます!
デビッド