Creazione di script di pulsanti in un ciclo forSto cercando di generare una tabella con un numero di righe che sarà variabile. Voglio che ogni riga abbia un pulsante che svolga una funzione a una variabile corrispondente in un elenco.
Problema attuale: gli script nel ciclo for non interpretano eval expr come previsto. Lo script risultante allegato a ciascuna casella di controllo dovrebbe indicare che è stato premuto il pulsante 1, 2 o 3. Invece dice sempre 4. L'obiettivo finale è eseguire un'operazione su UserText[i] quando si fa clic sulla casella di controllo.
Qualcuno può aiutarmi a spiegare cosa sto facendo di sbagliato? Grazie!
Domanda bonus: sto usando le caselle di controllo perché sono più piccole delle caselle dei pulsanti e le caselle dei pulsanti non sembrano essere ridimensionabili. Idealmente sarebbero solo piccole icone cliccabili. C'è un modo amichevole per creare una piccola "x" cliccabile invece di un pulsante pieno?
Versione JMP: 16
Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box(
Col Box( "Text", {} ),
Col Box( "Button", {} ),
),
tb << set row borders(1);
);
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>ScriptingRi: Creazione di script di pulsanti in un ciclo forCiao,
Eri molto vicino.
Se usi Eval ( EvalExpr ( ) ) per racchiudere l'intera istruzione tb << add row () come di seguito, otterrai il comportamento che stai cercando:
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
eval(evalexpr(
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>Ri: Creazione di script di pulsanti in un ciclo forEcco il mio modo vecchio stile di gestirlo
Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box(
Col Box( "Text", {} ),
Col Box( "Button", {} ),
),
tb << set row borders(1);
);
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>Ri: Creazione di script di pulsanti in un ciclo forIl mio metodo è un po' più complicato usando XPath e Contains(), ma in alcuni casi potrebbe essere più robusto (e puoi estenderlo ad altri elementi accanto a Checkbox se cambi XPath)
Names Default To Here(1);
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window("Select files",
tb = Table Box(Col Box("Text", {}), Col Box("Button", {}), Col Box("Third", {})),
tb << set row borders(1)
);
expr_tablebox_get_checkbox_idx = Expr(
row_idx = Contains((this << parent) << XPath("//CheckBoxBox"), this);
);
expr_tablebox_get_column_idx = Expr(
col_idx = Contains(((this << parent) << parent) << Get Names, (this << parent) << get heading)
);
expr_check_box = Expr(
expr_tablebox_get_checkbox_idx;
expr_tablebox_get_column_idx;
Show(row_idx, col_idx);
);
For Each({txt}, UserText,
tb << Add Row(
{Text Box(txt, << Set Width),
cb = Check Box({""}, << Set Function(function({this},
expr_check_box
))
),
cb = Check Box({""}, << Set Function(function({this},
expr_check_box
))
)
};
);
);
</CODE>Utilizzando questo metodo potresti riscontrare alcuni problemi in cui le espressioni vengono valutate correttamente a seconda di dove le chiami, quindi non dovrebbe essere il primo metodo da provare</P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-601493" slang="en-US" mode="NONE">Ri: Creazione di script di pulsanti in un ciclo for</LINGO-SUB><LINGO-BODY id="lingo-body-601493" slang="en-US" mode="NONE"><P>Sono tornato mentre ieri sera pensavo "questo può essere fatto anche con Xpath e contiene". La postazione di Jarmo era già qui; l'esempio che ho inserito di seguito è abbastanza simile, ma assegna tutte le funzioni della casella di controllo contemporaneamente con un'istruzione Xpath, una volta creata la tabella. Questo sta diventando uno dei miei modi preferiti per gestire questo tipo di cose.</P>
<P> </P>
<PRE><CODE class=" language-jsl">Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box( Col Box( "Text", {} ), Col Box( "Button", {} ), << set row borders(1) );
);
//add rows with a small button next to each one
For each ( { txt, i }, UserText,
tb << add row( {Text Box( txt, <<SET width=""></SET>
Ri: Creazione di script di pulsanti in un ciclo forGrazie! Avrò bisogno di dedicare un po' più di tempo alla comprensione di questo, non ho utilizzato la funzione set e non riesco a capire bene il comportamento dopo una rapida lettura della guida allo scripting e di alcuni esempi. Prevedo una situazione lungo la linea in cui avrò bisogno di funzionalità come questa, quindi lo ricorderò per un po 'e tornerò se quel momento verrà.
Per confermare qualcosa di fondamentale che non sembra essere dichiarato esplicitamente nel materiale: quando si definisce una funzione, "questo" è un termine predefinito in JSL che indicherà qualsiasi oggetto a cui è collegata la funzione? Vedo alcuni esempi che usano "questo" nell'argomento della funzione set senza che appaia altrove nella definizione della funzione (sono sicuro al 60% circa di usare i termini corretti). Le funzioni matematiche di base sono intuitive come MyFn = function ({x,y}, x + y ), ma poi le cose sembrano aumentare di complessità molto rapidamente quando entriamo negli oggetti.
Ri: Creazione di script di pulsanti in un ciclo forÈ solo il primo parametro quando viene utilizzato con << Set Function (come in esso non deve essere Questo , sembra che stia usando l'indice di scripting JMP17 thisBox Per esempio). E quel primo argomento è un riferimento a quella casella specifica in cui è impostata quella funzione.Questa pagina di aiuto potrebbe fornire ulteriori informazioni con alcuni esempi:
Guida allo scripting > Visualizza alberi > Crea finestre personalizzate > Imposta funzione e Imposta script
Inoltre, con alcune caselle di visualizzazione potresti essere in grado di utilizzare più parametri con << Set Function . Puoi vederli nell'indice di scripting (se riesci a trovarli, a volte potrebbe essere un po 'complicato)
