Come generare pulsanti all'interno di un ciclo?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sto cercando di generare pulsanti all'interno di un ciclo (un pulsante per ogni colonna). I pulsanti vengono creati correttamente, tranne per il fatto che quando il pulsante esegue il suo script, eseguirà sempre lo script dell'ultimo pulsante creato, invece dello script che è stato passato all'oggetto pulsante quando è stato creato.
Quindi, sembra che il pulsante ottenga solo un riferimento allo script e se lo script viene modificato il pulsante cambierà la sua funzione. Ho provato a considerare una soluzione alternativa con un array di script, ma il problema è che non posso passare alcun argomento per l'oggetto pulsante (ad esempio, indicizzare quale script nell'array eseguire).
Domanda: esiste un modo in jsl per creare pulsanti all'interno di un ciclo con script/comportamenti diversi? Ad esempio, esiste un modo per passare argomenti/dati all'oggetto pulsante quando viene creato???
Il mio codice:
NomiDefaultToHere(1);
dt = Tabella dati corrente();
dtCols = dt << Ottieni nomi colonne (numerico, continuo );
// Espressione per visualizzare la distribuzione per strParam
Expr_ShowDistribution = Expr(
Nuova finestra( Char(strParam),
Distribuzione(
Distribuzione continua(
Column( strParam ) //Specifichiamo il nostro parametro
),
Invia a rapporto(
Dispatch({}, "Distribution", OutlineBox, Imposta titolo( "" ) ),
)
)
)
);
// Finestra principale
Nuova finestra("Finestra principale",
ob = OutlineBox("Pulsanti",
TextBox("Pulsanti di debug", Imposta stile carattere("Grassetto"))
);
);
// Crea un pulsante che restituisce solo il log
BB = Casella del pulsante ("Fai clic su di me", Mostra ("Cliccato"));
ob << Accoda(BB);
// Crea pulsanti per mostrare le distribuzioni
For( i = 1, i <= NItems(dtCols), i++,
Expr_ButtonAction = Sostituisci(Espr_Nome(Espr_MostraDistribuzione),
Expr(strParam), Eval(Char(dtCols )) );
Mostra(NomeEspr(Espr_PulsanteAzione)); // L'espressione è diversa per ogni pulsante.
BB = Casella pulsante( Char(dtCols ), Eval(Expr_ButtonAction));
ob << Accoda(BB);
);
Ri: Come generare pulsanti all'interno di un loop?Il tuo esempio dovrebbe funzionare se le ultime due righe all'interno del ciclo, ad es
BB = Scatola dei bottoni ( Car ( dtCols [ io ]) , Valutazione ( Expr_ButtonAction )) ;
ob << Aggiungere ( BB ) ;
vengono sostituiti con
Valutazione ( Espr ( ob << Aggiungere ( Scatola dei bottoni ( Car ( dtCols [ io ] ) , Espr ( Nome Espr ( Expr_ButtonAction ) ) ) ) ) ) ;
Non è la soluzione più ovvia. Qui, penso che l'approccio della "manipolazione delle stringhe" come nell'esempio di PMroz sia più semplice.
Ri: Come generare pulsanti all'interno di un loop?Buona idea, ma non implementata.Per ora suggerirei di utilizzare il nome del pulsante come chiave per un array associativo.
Ri: Come generare pulsanti all'interno di un loop?IL Imposta funzione() approccio sembrerebbe più utile se potessi allegare alcuni dati utente al pulsante, ad esempio aggiungendo coppie chiave-valore a un array associativo.È possibile?
Ri: Come generare pulsanti all'interno di un loop?Uno script di pulsante può essere una funzione con un parametro "this" che fa riferimento al pulsante, il che significa che il pulsante può trovare il suo nome o la casella principale.
Nuova finestra( "esempio", v = V List Box() );
f = Funzione( {this}, Mostra( this << getbuttonname ) );
For( i = 1, i < 10, i++,
v << append( Button Box( "number " || Char( i ), Set Function( f ) ) )
);

Il parametro "Set Function" è la chiave per farlo funzionare.Nel tuo esempio penso che i nomi dei pulsanti potrebbero essere i nomi delle colonne.Il VListBox nell'esempio è denominato "v" in modo che le caselle dei pulsanti possano essere aggiunte ad esso.
Ri: Come generare pulsanti all'interno di un loop?Ecco un'implementazione che funziona.Ho cambiato l'espressione di distribuzione in una funzione, e poi ho dovuto giocare con evalinsert, parse, eval per farlo funzionare.
mostradistribuzione = funzione ({ nome_colonna } , { Locale predefinito } ,
dist_expr = evalinsert (
"\[Distribuzione( Distribuzione nominale( colonna(:nome("^nome_colonna^")) ) )]\" ) ;
eval ( analizzare ( dist_expr )) ;
) ;
// Finestra principale
Nuova finestra ( "Finestra principale" ,
ob = OutlineBox ( "Bottoni" ,
Casella di testo ( "Pulsanti di debug" , Imposta lo stile del carattere ( "Grassetto" ))
) ;
) ;
// Crea un pulsante che restituisce solo il log
BB = Scatola dei bottoni ( "Cliccami" , Spettacolo ( "Cliccato" )) ;
ob << Aggiungere ( BB ) ;
dt = aprire ( "$dati_campione\Big Class.jmp" ) ;
dtcols = dt << ottenere i nomi delle colonne ( corda ) ;
per ( io = 1 , io <= articoli ( dtcols ) , io ++,
pulsante_expr = evalinsert ( "\[one_button = pulsante casella("^dtcols ^", showdistribution("^dtcols ^"))]\" ) ;
eval ( analizzare ( pulsante_expr )) ;
ob << aggiungere ( one_button ) ;
) ;