Cuadros de lista: la propiedad "establecer seleccionados"Esta consulta está relacionada con una anterior mía sobre la actualización de algunos scripts para hacer un mejor uso de las capacidades de JMP 9 ( http://communities.sas.com/message/109908#109908 ), pero creo que no es exactamente el mismo problema. . Básicamente se trata de volver a dibujar una ventana que contiene un cuadro de lista en el que ya se ha realizado una selección. En el siguiente ejemplo simplificado, hago una selección de la Lista A y luego recreo la ventana en la que aparece la Lista A con un segundo cuadro de lista (Cuadro de lista
cuyo contenido depende de la selección realizada en A. Si el usuario selecciona de el cuadro de lista B, la selección final aparece en el cuadro de texto debajo de él. Si se realiza una selección desde el Cuadro de lista A, se proporciona una nueva lista de opciones en el Cuadro de lista B de la cual el usuario aún tiene que realizar una selección final. Ejecutar esto en JMP 8 funciona como quiero, mientras que ejecutarlo en JMP 9 crea un bucle infinito. Creo que puedo ver por qué: la línea que he marcado con un comentario (que resalta la selección realizada en el cuadro de lista A con una propiedad "<< establecer seleccionado" cuando ambos cuadros de lista A y B aparecen en la ventana) trata la asignación como si hubiera hecho esa selección haciendo clic en él, y actúa en consecuencia. Obviamente, podría simplemente eliminar esta línea, pero si lo hago, el usuario no podrá ver la ruta que llevó a la selección final de los cuadros de lista, y es necesario que así sea. Alternativamente, podría simplemente incluir todos los cuadros de lista en la ventana desde el principio y no volver a dibujar la ventana en absoluto, pero en la versión real de esto el usuario no sabe desde el principio cuántos cuadros de lista necesitará usar. y realmente no quiero mostrar en la pantalla más de lo que realmente se necesita en ningún momento.
Lista_A= {"Andy", "Bessi", "Carri", "Daviná", "Eddy"};
Lista_B= {};
Expr_Redraw_NW= exprés(
Cuadro_lista_A= Cuadro de lista(Lista_A, evaluar(Expr_Create_List_B ));
noroeste= nueva ventana("Nueva ventana",
HListBox(
Caja de paneles("Primera opción",Lista_cuadro_A ),
si(Una elección> 0,
Caja de paneles("Segunda elección",
Cuadro_lista_B,
Caja de texto(" "),
Cuadro de texto_Respuesta= Caja de texto("")
)
)
)
);
si(Una elección> 0,Cuadro_lista_A<<conjunto seleccionado ( A_Choice )); // Esta línea causa el problema;
noroeste<<mover ventana (200, 200);
);
Expr_Create_List_B= exprés(
Prefijo=( Cuadro_lista_A<<ser seleccionado )[1];
espectáculo(Prefijo );
Una elección=( Cuadro_lista_A<<obtener índices seleccionados )[1];
espectáculo(Una elección );
Lista_B= {};
para(i=1, i<=5, i++,
insertar en ( Lista_B , Prefijo || " " || char ( i ))
);
Cuadro_lista_B= Cuadro de lista(List_B,
B_elección=( Cuadro_lista_B<<ser seleccionado )[1];
Cuadro de texto_Respuesta<<establecer texto ("La selección es: " ||B_Elección );
noroeste<<volver a mostrar
);
noroeste<<Cerrar ventana;
evaluar(Expr_Redraw_NW );
);
Cuadro_lista_B= Cuadro de lista(List_B, imprimir(""));
Cuadro de texto_Respuesta= Caja de texto("");
Respuesta= "";
Una elección= 0;
evaluar(Expr_Redraw_NW );
¿Alguien puede ver una salida sencilla a esto que no implique reestructurar sustancialmente la forma en que funciona? Tengo un problema similar en tres o cuatro scripts, por lo que, si puedo, me gustaría reducir al mínimo el trabajo de reparación.
Muchas gracias por cualquier ayuda recibida.
Cuadros de lista: la propiedad "establecer seleccionado"No he encontrado una solución súper simple. Una forma de eliminar el riesgo de caer en la trampa recursiva es tener una comunicación unidireccional entre las expresiones clave.
A continuación se muestra un ejemplo que elimina/añade condicionalmente el cuadro del panel que contiene List_Box_B, en lugar de volver a dibujar toda la ventana. Por lo tanto, no es necesario actualizar el cuadro de lista A y todo el trabajo de redibujado se llama desde el script en List_Box_A sin "retroalimentación" de Expr_Create_List_B. Puede que no sea tan simple como esperaba, pero parece funcionar en JMP9.
Lista_A = { "Andy" , "Bessi" , "Carri" , "Davina" , "Eddy" } ;
Lista_B = {} ;
Expr_Redraw_NW = Expr (
List_Box_A = Cuadro de lista (
Lista_A ,
Evaluación ( Expr_Create_List_B ) ;
Pruebe ( Panel_Box_B << eliminar ) ;
Si ( A_Choice > 0 ,
HL << Agregar ( Eval ( Expr_Panel_Box_B ) ) ;
Una_elección = 0 ; // para habilitar el reinicio haciendo clic en la selección
);
);
Si ( A_Choice == 0 ,
NO = Nueva ventana ( "Nueva ventana" ,
HL = H Cuadro de lista (
Cuadro de panel ( "Primera opción" , List_Box_A ) ,
Si ( A_Choice > 0 ,
Evaluación ( Expr_Panel_Box_B )
)
)
)
);
NW << mover ventana ( 200 , 200 ) ;
);
Expr_Create_List_B = Expr (
Intentar (
Prefijo = ( List_Box_A << ser seleccionado )[ 1 ] ;
Mostrar ( Prefijo ) ;
A_Choice = ( List_Box_A << obtener índices seleccionados )[ 1 ] ;
Mostrar ( A_Choice ) ;
Lista_B = {} ;
Para ( yo = 1 , yo <= 5 , yo ++,
Insertar en ( Lista_B , Prefijo || " " || Char ( i ) )
);
List_Box_B = Cuadro de lista (
Lista_B ,
B_Choice = ( List_Box_B << ser seleccionado )[ 1 ] ;
TextBox_Answer << establecer texto ( "La selección es: " || B_Choice ) ;
NO << volver a mostrar
);
);
);
Expr_Panel_Box_B = Expr (
Panel_Box_B = Cuadro de panel ( "Segunda opción" ,
Lista_Box_B ,
Caja de texto ( " " ) ,
TextBox_Answer = Cuadro de texto ( "" )
)
);
List_Box_B = Cuadro de lista ( List_B , Imprimir ( "" ) ) ;
TextBox_Answer = Cuadro de texto ( "" ) ;
Respuesta = "" ;
Una_Elección = 0 ;
Evaluación ( Expr_Redraw_NW ) ;
Cuadros de lista: la propiedad "establecer seleccionados"¡Genial! Sí, resuelve el problema a la perfección, y no solo eso, sino que también me sugiere una forma de extender el proceso para abarcar una cadena de consultas similares. ¡Muchísimas gracias!
David