Ecco una funzione 'hierListBox ()':
// ************************************************ ******************************************
// ian.cox@jmp.com : 04 settembre 2007
//
// Crea un ListBox "gerarchico", in cui è visualizzato il contenuto visualizzato per la seconda lista
// condizionale alla selezione corrente nel primo elenco. Selezioni multiple in entrambe le liste
// sono ammessi.
// ************************************************ ******************************************
Chiari Globali () ;
hierListBox = Funzione ( { dt , c1 , c2 , winTitle } ,
// Crea il mapping richiesto: m mappa ogni valore univoco in c1 a tutti i corrispondenti
// valori in c2
m = [ => ] ;
Per ogni riga (
K = c1 [ Riga ()] ;
Se ( ! ( m << contiene ( K )) ,
m [ K ] = {}
) ;
m [ K ] = Inserire ( m [ K ] , c2 [ Riga ()] ) ;
) ;
// Crea l'interfaccia utente iniziale
l1 = c1 << GetValues ;
l2 = c2 << GetValues ;
LB1 = Casella di riepilogo ( l1 , lb1Script ( LB1 ) ) ;
lb2 = Casella di riepilogo ( l2 ) ;
nw = Nuova finestra ( winTitle ,
LB1 ,
lb2 ,
H List Box ( Scatola dei pulsanti ( "OK" , OKScript ) , Scatola dei pulsanti ( "Annulla" , nw << Chiudi la finestra ) )
) ;
// Script che viene eseguito quando viene effettuata o modificata la selezione in lb1 (aggiorna i contenuti di lb2)
lb1Script = expr (
slb1 = LB1 << GetSelected ;
l2new = {} ;
Per ( io = 1 , io <= N articoli ( slb1 ) , io ++,
Inserire ( l2new , m [ slb1 [ io ]] )
) ;
lb2 << Elimina ;
lb2 = Casella di riepilogo ( l2new ) ;
nw [ ListBoxBox ( 1 )] << SibAppend ( lb2 ) ;
) ;
// Quando viene effettuata la selezione dell'utente. . .
OKScript = expr (
nw << Chiudi la finestra ;
l1 = LB1 << GetSelected ;
l2 = lb2 << GetSelected ;
// Crea un elenco delle selezioni dalle due caselle di riepilogo
l = Eval List ( { l1 , l2 } ) ;
) ;
) ;
// Tavolo . . .
dt = Nuova tabella ( "Test" ,
Aggiungi righe ( 20 ) ,
Nuova colonna ( "Stato" ,
Personaggio ,
Nominale ,
Imposta valori (
{ "FL" , "FL" , "NC" , "MI" , "AZ" , "MI" , "NC" , "MI" , "AZ" , "FL" , "FL" , "NC" , "FL" , "NC" , "MI" , "FL" , "FL" ,
"MI" , "NC" , "NC" }
)
) ,
Nuova colonna ( "Città" ,
Personaggio ,
Nominale ,
Imposta valori (
{ "Città 1" , "Città 2" , "Città 3" , "Città 4" , "Città 5" , "Città 6" , "Città 7" , "Città 8" , "Città 9" , "Città 10" ,
"Città 11" , "Città 12" , "Città 13" , "Città 14" , "Città 15" , "Città 16" , "Città 17" , "Città 18" , "Città 19" ,
"Città 20" }
)
)
) ;
// colonne. . .
c1 = Colonna ( dt , "Stato" ) ;
c2 = Colonna ( dt , "Città" ) ;
// Crea una mappa. . .
l = hierListBox ( dt , Colonna ( "Stato" ) , Colonna ( "Città" ) , "Condizionale" ) ;
Mostrare ( l ) ;
Ecco un esempio che potrebbe aiutarti:

dt = Aperto ( "$ SAMPLE_DATA / Cars 1993.jmp" ) ;
Ricapitolare ( lstMake = Di ( "Produttore" )) ;
Inserire ( lstMake , "Selezionare..." , 1 ) ;
nw = Nuova finestra ( "Seleziona tipo di auto" ,
Border Box ( Superiore ( 10 ) , Sinistra ( 20 ) , Destra ( 20 ) ,
Box di selezione ( NCol ( 1 ) ,
CB = Casella combinata ( lstMake , << copione ( doSelection () ) ) ,
libbre = Casella di riepilogo ( {} , Larghezza ( 100 ) , nlines ( 6 ) ) ,
Border Box ( Sinistra ( 120 ) , Superiore ( 4 ) , Parte inferiore ( 4 ) , Destra ( 4 ) ,
Scatola dei pulsanti ( "OK" , Dook () )
)
)
)
) ;
doSelection = Funzione ({} ,
rendere = CB << Ottieni selezionato ;
righe = dt << Ottieni righe dove ( AsColumn ( "Produttore" ) == rendere ) ;
lstModel = Colonna ( "Modello" ) [ righe ] ;
libbre << Rimuovi tutto ;
libbre << Aggiungere ( lstModel ) ;
dt << Cancella Seleziona ;
) ;
Dook = Funzione ( {} ,
cbSel = CB << Ottieni selezionato ;
lbSel = libbre << Ottieni selezionato ;
nw << Chiudi la finestra ;
Mostrare ( cbSel , lbSel ) ;
) ;