Variables globales écrasées dans une boucleBonjour,
Je crée des fenêtres en boucle, en suivant les colonnes. Par exemple, dans l'exemple JSL ci-dessous, je crée une fenêtre avec la distribution et un bouton qui masque temporairement la fenêtre pour chaque colonne (Âge, Poids). Le problème est que, au fur et à mesure que ma boucle avance, mes variables d'objet sont écrasées par la fenêtre précédente .
Par exemple, dans la fenêtre d'âge générée par l'exemple, cliquer sur le bouton est censé masquer temporairement la fenêtre Âge, mais en réalité, il masque la fenêtre Poids car celle-ci a été écrasée.
Est-il possible de définir des noms par défaut pour chaque fenêtre, afin qu'elle dispose de son propre espace indépendant sans avoir à renommer les variables à chaque fois ? J'en ai beaucoup…
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
lstCols = {"age", "weight"};
For Each( {value, index}, lstCols,
colref = Column( value );
window = New Window( "Window - " || value,
V List Box(
distribution = dt << Distribution( Column( colref ) ),
Button Box( "Hide",
window << show window( 0 );
Wait( 2 );
window << show window( 1 );
)
);
);
);
Automatisation et scriptageRe: Variables globales écrasées dans une boucleVous pouvez utiliser la portée de la fenêtre
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
nws = {};
For Each({value, index}, lstCols,
colref = Column(value);
nw = New Window("Window - " || value,
V List Box(
window:dist = dt << Distribution(Column(colref)),
Button Box("Hide",
window:dist << show window(0);
Wait(2);
window:dist << show window(1);
)
);
);
Insert Into(nws, nw);
);
For Each({nw}, nws,
Show(nw:dist << Get Window Title)
);
Vous pourriez également évaluer la référence au script/à la fonction du bouton ou utiliser une fonction légèrement plus complexe au sein du bouton pour prendre en compte la portée.
Re: Variables globales écrasées dans une boucleVoici une solution qui n'est pas aussi élégante que la réponse de @jthi , mais qui me semble plus intuitive.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
lstCols = {"age", "weight"};
windows = Associative Array();
For Each( {value, index}, lstCols,
colref = Column( value );
Eval(EvalExpr(
windows[value] = New Window( "Window - " || value,
V List Box(
distribution = dt << Distribution( Column( colref ) ),
Button Box( "Hide",
windows[Expr(value)] << show window( 0 );
Wait( 2 );
windows[Expr(value)] << show window( 1 );
)
);
);
));
);
Le tableau associatif « windows » fournit un conteneur qui conserve des références aux différentes fenêtres et « Eval(EvalExpr(...)) » est utilisé pour s'assurer que le script d'un bouton particulier n'évalue pas la « valeur » actuelle mais celle qui se trouvait dans la portée au moment de sa création.
Re: Variables globales écrasées dans une boucle+1. La portée des fenêtres est décrite ici : https://www.jmp.com/support/help/en/19.1/?os=mac&source=application#page/jmp/scoped-names.shtml
Re: Variables globales écrasées dans une boucleBonjour, merci ! Cela a résolu mon problème.
Re: Variables globales écrasées dans une boucleBonjour, merci pour votre réponse, c'est une autre façon de faire !
Re: Variables globales écrasées dans une boucleVous pouvez également utiliser << Définir la fonction et utiliser la référence des boutons comme point de départ
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
For Each({colname}, lstCols,
nw = New Window("Window - " || colname,
V List Box(
dt << Distribution(Column(Eval(colname))),
Button Box("Hide", << Set Function(Function({this},
dist_ob = this << prev sib;
show(dist_ob[OutlineBox(2)] << get title);
)));
);
);
);
Write();
and in this case for hiding the window you could just use this << Show Window(0);</CODE></EM></P>
<P>La boîte de contexte peut également être utilisée dans certains cas :</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
lstCols = {"age", "weight"};
For Each({colname}, lstCols,
nw = New Window("Window - " || colname,
V List Box(
Context Box(
box:dist = dt << Distribution(Column(Eval(colname))),
Button Box("Hide",
show(Report(box:dist)[OutlineBox(2)] << get title)
);
)
);
);
);
Write();
J'utilise toutes ces méthodes (et l'évaluation d'expressions) en fonction de la situation.