<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />此查詢與我之前的查詢相關,該查詢涉及升級一些腳本以更好地利用 JMP 9 的功能( http://communities.sas.com/message/109908#109908 ),但我認為這不是同一個問題。本質上,它涉及重新繪製包含已從中進行選擇的列錶框的視窗。在下面的簡化範例中,我從清單 A 中進行選擇,然後重新建立其中顯示清單 A 的窗口,並使用第二個列錶框(列錶框 B),其內容取決於從 A 中所做的選擇。如果使用者從列錶框 B 中進行選擇,則最終選擇將出現在其下方的文字方塊中。如果從列錶框 A 中進行選擇,則列錶框 B 中會提供新的選擇列表,使用者仍需從中做出最終選擇。在 JMP 8 中運行它可以按照我的意願運行,而在 JMP 9 中運行它會創建一個無限循環。我想我可以明白為什麼:我用註釋標記的行(當列錶框 A 和 B 都出現在視窗中時,突出顯示從列錶框 A 中使用“<< set selected”屬性所做的選擇)處理分配就好像我透過點擊做出了選擇,並採取了相應的行動。顯然我可以刪除這一行,但如果我這樣做,用戶將無法看到導致從列錶框中進行最終選擇的路徑 - 他有必要這樣做。或者,我可以簡單地從一開始就將所有列錶框包含在視窗中,而根本不重繪窗口,但在實際版本中,用戶一開始並不知道他需要使用多少個列錶框 -我真的不想在任何時間在螢幕上顯示超出實際需要的內容。
列表_A = { “安迪” , “貝西” , “嘉莉” , “達維娜” , “艾迪” } ;
列表_B = {} ;
Expr_Redraw_NW =表達式(
列錶框A =列錶框(列表_A ,評估( Expr_Create_List_B )) ;
西北=新窗戶( “新窗戶” ,
列錶框(
面板盒( “第一選擇” ,列錶框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 ) ;
任何人都可以找到一種簡單的方法來解決這個問題,而無需大幅調整其工作方式嗎?我在三到四個腳本中遇到了類似的問題,因此如果可以的話,我希望將任何補救工作保持在最低限度。
非常感謝您收到的任何幫助。
我還沒有找到超級簡單的解決方案。消除陷入遞歸陷阱的風險的一種方法是在關鍵表達式之間進行單向通訊。
下面的範例有條件地刪除/追加包含 List_Box_B 的面板框,而不是重繪整個視窗。因此列錶框A不需要更新,所有重繪工作都是從List_Box_A中的腳本呼叫的,而不需要來自Expr_Create_List_B的「回饋」。它可能不像您希望的那麼簡單,但它似乎可以在 JMP9 中工作。
List_A = { “安迪” , “貝西” , 「嘉莉」 , “達維娜” , “艾迪” } ;
列表_B = {} ;
Expr_Redraw_NW = Expr (
List_Box_A =列錶框(
列表_A ,
評估( Expr_Create_List_B ) ;
嘗試( Panel_Box_B <<刪除) ;
如果( A_Choice > 0 ,
HL <<追加( Eval ( Expr_Panel_Box_B ) ) ;
A_選擇= 0 ; // 按住 Control 鍵點擊選擇來啟用重置
);
);
如果( A_Choice == 0 ,
西北= 新視窗( “新視窗” ,
HL = H 列錶框(
面板框( “第一個選擇” , List_Box_A ) ,
如果( A_Choice > 0 ,
評估( Expr_Panel_Box_B )
)
)
)
);
NW <<移動視窗( 200 , 200 ) ;
);
Expr_Create_List_B = Expr (
嘗試(
前綴= ( 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 ) ;
西北<<重播
);
);
);
Expr_Panel_Box_B = Expr (
Panel_Box_B =面板方塊( "第二選擇" ,
列錶框_B ,
文字方塊( ” ” ) ,
TextBox_Answer =文字方塊( "" )
)
);
List_Box_B =列錶框( List_B , Print ( "" ) ) ;
TextBox_Answer =文字方塊( "" ) ;
答案= “” ;
A_選擇= 0 ;
評估( Expr_Redraw_NW ) ;
太棒了!是的——它完美地解決了這個問題,不僅如此,它還啟發我如何擴展這個過程,使其能夠處理一系列類似的查詢。非常感謝!
大衛