Créer un gestionnaire d'état de ligneSalut,
J'ai un code JSL pour ajouter des cases de boutons pour la sélection de lignes. Le problème est qu'il continue d'ajouter des cases en double même si une seule ligne est sélectionnée. Je souhaite uniquement ajouter une case « n » pour « n » lignes sélectionnées. Si aucune ligne n'est sélectionnée, toutes les cases de la zone de tableau doivent être supprimées.
Il a ajouté 10 cases en sélectionnant simplement 1 ligne.

Names Default To Here( 1 );
dt2 = Open( "$SAMPLE_DATA/Iris.jmp", invisible );
New Window( "",
H List Box(
Graph Builder(
Size( 653, 571 ),
Show Control Panel( 0 ),
Variables( X( :Sepal length ), Y( :Sepal width ), Overlay( :Species ) ),
Elements( Points( X, Y, Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "Sepal length", ScaleBox, {Min( 4.02451368343195 ), Max( 8.24903846153846 ), Inc( 1 ), Minor Ticks( 0 )} ),
Dispatch( {}, "Sepal width", ScaleBox, {Min( 1.75 ), Max( 5.00400457665904 ), Inc( 1 ), Minor Ticks( 0 )} )
)
),
Spacer Box( size( 10, 0 ) ),
Outline Box( "Petal Species",
Spacer Box( size( 0, 10 ) ),
Scroll Box(
size( 350, 150 ),
disoi = Table Box(
colbox = Col Box( "Species" ),
//imvinum = Number Col Edit Box( "iMINum", {} ),
)
),
disoi << set selectable rows( 0 ),
)
)
);
f = Function( {this},
dt2 << begin data update;
list = {};
checnro = N Items( dt2 << getselectedrows );
For( i = 1, i <= checnro, i++,
Insert Into( list, dt2:Species[dt2 << getselectedrows][i] );
);
For Each( {wascc, idx}, list,
//For( k = 1, k <= N Items( list ), k++,
colbox << append(
Eval(
Parse(
"ex" || Char( idx ) ||
" = Button Box( wascc
,
New Window( \!"Wikipedia\!",
<<TYPE></TYPE><LINGO-LABS id="lingo-labs-755955" slang="en-US" mode="CREATE"><LINGO-LABEL>Automatisation et scripts</LINGO-LABEL></LINGO-LABS>Re : Créer un gestionnaire d'état de ligneMerci Jarmo!
C'est exactement ce que je veux.
Pouvons-nous réorganiser les colonnes dans la zone de tableau ? Nvm, j'ai compris
Re: Créer un gestionnaire d'état de ligneVous devrez d'une manière ou d'une autre retirer les anciennes boîtes.
Je ne suis pas sûr que cela fasse ce que vous souhaitez, mais j'ai apporté des modifications assez importantes à votre script
Names Default To Here(1);
dt2 = Open("$SAMPLE_DATA/Iris.jmp", invisible);
dt2 << Clear Select;
nw = New Window("",
H List Box(
Graph Builder(
Size(653, 571),
Show Control Panel(0),
Variables(X(:Sepal length), Y(:Sepal width), Overlay(:Species)),
Elements(Points(X, Y, Legend(6)))
),
Spacer Box(size(10, 0)),
Outline Box("Petal Species",
Spacer Box(size(0, 10)),
Scroll Box(
size(350, 150),
tb_species = Table Box(,<< set selectable rows(0))
)
)
)
);
add_buttons = Function({a},
selrows = dt2 << get selected rows;
sel_species = Associative Array(dt2[selrows, "Species"]) << get keys;
new_colbox = Col Box("Species");
For Each({cur_species, idx}, sel_species,
new_colbox << append(
Button Box(cur_species
, << Set Function(function({this},
New Window("Wikipedia", Web Browser Box("https://en.wikipedia.org/wiki/Iris_" || (this << get button name)));
))
, << Underline Style(1),
)
)
);
Try(tb_species[ColBox(1)] << Delete Box());
tb_species << append(new_colbox);
);
rs = dt2 << make row state handler(add_buttons);
Re : Créer un gestionnaire d'état de ligneSi j'ai besoin de la fonction f pour sélectionner plus de points, puis-je éviter une boucle sans fin ?
rs = dt << Make Row State Handler( f );
f = Function( {a},
r = dt << Get Selected Rows;
If( N Items( r ) > 0,
dt << Go To( :lot );
dt << Select Matching Cells();
);
);
Re : Créer un gestionnaire d'état de ligneUne option consiste à ajouter quelques vérifications supplémentaires :
- De nouvelles lignes ont été sélectionnées (et peut-être que de nouvelles valeurs ont été sélectionnées)
- Et que la sélection n'a pas été effectuée par << Sélectionner les cellules correspondantes
Cela sera probablement encore un peu complexe, mais c'est sans doute le meilleur résultat possible. Il serait peut-être préférable d'utiliser un filtre de données (global) pour les sélections.