Aquí hay una función 'hierListBox ()':
// ************************************************ ******************************************
// ian.cox@jmp.com : 04 sep2007
//
// Hace un ListBox "jerárquico", donde el contenido que se muestra para la segunda lista es
// condicional a la selección actual en la primera lista. Múltiples selecciones en ambas listas
// están permitidos.
// ************************************************ ******************************************
Globos claros () ;
hierListBox = Función ( { dt , c1 , c2 , wintitle } ,
// Realice la asignación necesaria: m asigna cada valor único en c1 a todos los correspondientes
// valores en c2
metro = El => ] ;
Por cada fila (
k = c1 El Fila ()] ;
Si ( ! ( metro << Contiene ( k )) ,
metro El k ] = {}
) ;
metro El k ] = Insertar ( metro El k ] , c2 El Fila ()] ) ;
) ;
// Construir IU inicial
l1 = c1 << GetValues ;
l2 = c2 << GetValues ;
lb1 = Cuadro de lista ( l1 , lb1Script ( lb1 ) ) ;
lb2 = Cuadro de lista ( l2 ) ;
noroeste = Nueva ventana ( wintitle ,
lb1 ,
lb2 ,
Cuadro de lista H ( Caja de botones ( "DE ACUERDO" , OKScript ) , Caja de botones ( "Cancelar" , noroeste << Cerrar ventana ) )
) ;
// Script que se ejecuta cuando se realiza o cambia la selección en lb1 (actualiza el contenido de lb2)
lb1Script = Expr (
slb1 = lb1 << GetSelected ;
l2new = {} ;
por ( yo = 1 , yo <= N artículos ( slb1 ) , yo ++,
Insertar en ( l2new , metro El slb1 El yo ]] )
) ;
lb2 << Borrar ;
lb2 = Cuadro de lista ( l2new ) ;
noroeste El ListBoxBox ( 1 )] << SibAppend ( lb2 ) ;
) ;
// Cuando se realiza la selección del usuario. . .
OKScript = Expr (
noroeste << Cerrar ventana ;
l1 = lb1 << GetSelected ;
l2 = lb2 << GetSelected ;
// Haga una lista de las selecciones de los dos cuadros de lista
l = Lista de evaluación ( { l1 , l2 } ) ;
) ;
) ;
// Mesa . . .
dt = Nueva mesa ( "Prueba" ,
Añadir filas ( 20 ) ,
Nueva Columna ( "Estado" ,
Personaje ,
Nominal ,
Valores establecidos (
{ "FLORIDA" , "FLORIDA" , "CAROLINA DEL NORTE" , "MI" , "ARIZONA" , "MI" , "CAROLINA DEL NORTE" , "MI" , "ARIZONA" , "FLORIDA" , "FLORIDA" , "CAROLINA DEL NORTE" , "FLORIDA" , "CAROLINA DEL NORTE" , "MI" , "FLORIDA" , "FLORIDA" ,
"MI" , "CAROLINA DEL NORTE" , "CAROLINA DEL NORTE" }
)
) ,
Nueva Columna ( "Ciudad" ,
Personaje ,
Nominal ,
Valores establecidos (
{ "Ciudad 1" , "Ciudad 2" , "Ciudad 3" , "Ciudad 4" , "Ciudad 5" , "Ciudad 6" , "Ciudad 7" , "Ciudad 8" , "Ciudad 9" , "Ciudad 10" ,
"Ciudad 11" , "Ciudad 12" , "Ciudad 13" , "Ciudad 14" , "Ciudad 15" , "Ciudad 16" , "Ciudad 17" , "Ciudad 18" , "Ciudad 19" ,
"Ciudad 20" }
)
)
) ;
// Columnas. . .
c1 = Columna ( dt , "Estado" ) ;
c2 = Columna ( dt , "Ciudad" ) ;
// Hacer mapa. . .
l = hierListBox ( dt , Columna ( "Estado" ) , Columna ( "Ciudad" ) , "Condicional" ) ;
Show ( l ) ;
Aquí hay un ejemplo que podría ayudarte:

dt = Abierto ( "$ SAMPLE_DATA / Cars 1993.jmp" ) ;
Resumir ( lstmake = Por ( "Fabricante" )) ;
Insertar en ( lstmake , "Seleccionar..." , 1 ) ;
noroeste = Nueva ventana ( "Seleccionar tipo de coche" ,
Caja de borde ( Parte superior ( 10 ) , Izquierda ( 20 ) , Derecha ( 20 ) ,
Caja de alineación ( NCol ( 1 ) ,
cb = Caja combo ( lstmake , << Guión ( doSelection () ) ) ,
libra = Cuadro de lista ( {} , Anchura ( 100 ) , NLines ( 6 ) ) ,
Caja de borde ( Izquierda ( 120 ) , Parte superior ( 4 ) , Fondo ( 4 ) , Derecha ( 4 ) ,
Caja de botones ( "DE ACUERDO" , hacer () )
)
)
)
) ;
doSelection = Función ({} ,
hacer = cb << Ser seleccionado ;
filas = dt << Obtener filas donde ( As Columna ( "Fabricante" ) == hacer ) ;
lstModel = Columna ( "Modelo" ) [ filas ] ;
libra << Eliminar todo ;
libra << Adjuntar ( lstModel ) ;
dt << Borrar seleccionar ;
) ;
hacer = Función ( {} ,
cbSel = cb << Ser seleccionado ;
lbSel = libra << Ser seleccionado ;
noroeste << Cerrar ventana ;
Show ( cbSel , lbSel ) ;
) ;