목록 상자 - "선택된 설정" 속성<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에 새로운 선택 목록이 제공됩니다.JMP 8에서 이것을 실행하면 내가 원하는 대로 작동하는 반면, JMP 9에서 실행하면 무한 루프가 생성됩니다.이유를 알 수 있을 것 같습니다. 주석으로 표시한 줄(목록 상자 A와 B가 모두 창에 나타날 때 "<< 선택 항목 설정" 속성을 사용하여 목록 상자 A에서 선택한 항목을 강조 표시함)이 할당을 처리합니다. 마치 내가 그것을 클릭해서 선택한 것처럼, 그에 따라 행동합니다.분명히 이 줄을 제거할 수도 있지만 그렇게 하면 사용자는 목록 상자에서 최종 선택 항목으로 이어지는 경로를 볼 수 없습니다. 따라서 그렇게 해야 합니다.또는 처음부터 창에 모든 목록 상자를 포함하고 창을 전혀 다시 그리지 않을 수도 있지만, 이 실제 버전에서는 사용자가 처음에 얼마나 많은 목록 상자를 사용해야 할지 알 수 없습니다. 그리고 나는 실제로 필요한 것보다 더 많은 것을 한 번에 화면에 보여주고 싶지 않습니다.
목록_A = { "앤디" , "베시" , "캐리" , "다비나" , "에디" } ;
목록_B = {} ;
Expr_Redraw_NW = 특급 (
List_Box_A = 리스트 박스 ( 목록_A , 평가 ( Expr_Create_List_B )) ;
북서쪽 = 새창 ( "새창" ,
HListBox (
패널박스 ( "첫번째 선택" , List_Box_A ) ,
만약에 ( 선택 > 0 ,
패널박스 ( "두 번째 선택" ,
목록_상자_B ,
텍스트 상자 ( " " ) ,
TextBox_Answer = 텍스트 상자 ( "" )
)
)
)
) ;
만약에 ( 선택 > 0 , List_Box_A << 선택된 세트 ( 선택 )) ; // 이 줄이 문제를 일으킵니다.
북서쪽 << 창 이동 ( 200 , 200 ) ;
) ;
Expr_Create_List_B = 특급 (
접두사 = ( List_Box_A << 선발되다 )[ 1 ] ;
보여주다 ( 접두사 ) ;
선택 = ( List_Box_A << 선택된 인덱스 가져오기 )[ 1 ] ;
보여주다 ( 선택 ) ;
목록_B = {} ;
~을 위한 ( 나 = 1 , 나 <= 5 , 나 ++,
에 집어 넣다 ( 목록_B , 접두사 || " " || 숯 ( 나 ))
) ;
목록_상자_B = 리스트 박스 ( 목록_B ,
B_초이스 = ( 목록_상자_B << 선발되다 )[ 1 ] ;
TextBox_Answer << 텍스트 설정 ( "선택 항목: " || B_초이스 ) ;
북서쪽 << 재쇼
) ;
북서쪽 << 창 닫기 ;
평가 ( Expr_Redraw_NW ) ;
) ;
목록_상자_B = 리스트 박스 ( 목록_B , 인쇄 ( "" )) ;
TextBox_Answer = 텍스트 상자 ( "" ) ;
답변 = "" ;
선택 = 0 ;
평가 ( Expr_Redraw_NW ) ;
작동 방식을 실질적으로 재구성하지 않고도 이 문제를 해결할 수 있는 간단한 방법을 찾을 수 있는 사람이 있습니까?3~4개의 스크립트에서 비슷한 문제가 발생하므로 가능하면 수정 작업을 최소한으로 유지하고 싶습니다.
도움을 주셔서 감사드립니다.
목록 상자 - "선택된 설정" 속성나는 매우 간단한 해결책을 찾지 못했습니다. 재귀 함정에 빠질 위험을 제거하는 한 가지 방법은 주요 표현 간에 단방향 통신을 하는 것입니다.
다음은 전체 창을 다시 그리는 대신 List_Box_B가 포함된 패널 상자를 조건부로 삭제/추가하는 예제입니다. 따라서 목록 상자 A는 업데이트할 필요가 없으며 모든 다시 그리기 작업은 Expr_Create_List_B의 "피드백" 없이 List_Box_A의 스크립트에서 호출됩니다. 기대한 것만큼 간단하지는 않지만 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 ; // Ctrl 키를 누른 채 선택 항목을 클릭하여 재설정을 활성화합니다.
);
);
If ( 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 << 텍스트 설정 ( "선택 항목: " || B_Choice ) ;
NW << 다시보기
);
);
);
Expr_Panel_Box_B = Expr (
Panel_Box_B = 패널 상자 ( "두 번째 선택" ,
목록_상자_B ,
텍스트 상자 ( " " ) ,
TextBox_Answer = 텍스트 상자 ( "" )
)
);
List_Box_B = 목록 상자 ( List_B , 인쇄 ( "" ) ) ;
TextBox_Answer = 텍스트 상자 ( "" ) ;
답변 = "" ;
A_초이스 = 0 ;
평가 ( Expr_Redraw_NW ) ;
목록 상자 - "선택 항목 설정" 속성정말 기발하네요! 네, 문제를 아주 깔끔하게 해결해 줄 뿐만 아니라, 이런 쿼리들을 연속적으로 처리하는 방식으로 확장할 수 있는 방법까지 제시해 주셨어요. 정말 감사합니다!
데이비드