Problème
Dans de nombreuses situations, lorsque vous utilisez une zone de curseur pour contrôler une variable numérique, vous souhaitez également un affichage numérique modifiable pour afficher la valeur de la variable, ce qui vous permet de définir manuellement la valeur de la variable.
La façon actuelle de procéder consiste à créer deux objets d'affichage : une boîte d'édition de nombre () et une boîte de curseur ().Vous devez coder cela de manière à ce qu'ils soient connectés.De plus, la façon dont la zone d'édition numérique interagit avec les modifications apportées aux valeurs saisies manuellement (à l'aide de <
Je me retrouve souvent à devoir prendre beaucoup de temps à lire le guide de script sur la façon de créer ces objets et comment les connecter. (J'aimerais qu'il y ait un objet d'affichage JMP intégré comme celui-ci)
Solution
J'ai créé une fonction SliderNumberEditBox() qui crée une expression évaluée qui crée les deux boîtes d'affichage ensemble. Ces boîtes d'affichage seront connectées comme décrit ci-dessus.Il prend comme arguments des chaînes de caractères qui définissent les références à la zone d'édition du nombre, la valeur initiale de la zone d'édition du nombre, la référence à la zone de curseur, la plage supérieure et inférieure de la zone de curseur, la variable contrôlée par le curseur box, et éventuellement, l'expression que vous souhaitez exécuter lorsque la zone d'édition de nombre est mise à jour manuellement, et l'expression que vous souhaitez exécuter lorsque la zone de curseur est modifiée.(notez que les expressions doivent être définies comme des chaînes de caractères et que les séquences d'échappement appropriées doivent être utilisées pour les caractères réservés que vous souhaitez mettre entre guillemets dans la chaîne).
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>La fonction utilise la concaténation de chaînes pour créer la version chaîne entière de l'expression pour les zones d'affichage, puis analyse la chaîne dans une expression et renvoie l'expression évaluée.
Syntaxe
SliderNumberEditBox( chaîne pour la référence à la zone d'édition du numéro , chaîne pour la valeur initiale de la zone d'édition du nombre , chaîne pour la référence à la boîte de curseur , chaîne pour la plage inférieure du curseur , chaîne pour la plage supérieure du curseur , chaîne pour la variable contrôlée par le curseur , , )
k = 1;
SliderNumberEditBox(
"_neb1",
Char( k ),
"_sb1",
"0",
"2",
"k")
renvoie l'expression évaluée ci-dessous
H List Box(
_neb1 = Number Edit Box(
0.5,
<<SET function=""></SET>
Exemple
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>crée une fenêtre qui ressemble à ceci (j'ai changé la case du curseur à une valeur différente)

Je cherchais dans la communauté quelques bons exemples d'utilisation d'Eval/Eval Expr lorsque je suis tombé sur cela et j'ai pensé que je partagerais mon implémentation de la fonction SliderNumberEditBox qui utilise la construction d'expression plutôt que la concaténation de chaînes.
De nombreux arguments transmis à la fonction ne sont plus des chaînes et il existe désormais un argument d'option nsName pour fournir le nom de l'espace de noms dans lequel les variables doivent exister (par défaut, global).
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar,
nsName = "global", nebFunction = Expr(), sbFunction = Expr()},
Eval( // evaluate to create the diplay boxes
Eval Expr( // evaluate everything wrapped with Expr()
H List Box(
// Create the Number Edit Box
// As Scoped() is used when the variable names are to be dynamic
As Scoped( Expr( nsName ), Expr( nebref ) ) = Number Edit Box(
Expr( nebinitval ),
<<SET function=""></SET>
Toute personne intéressée à en savoir plus sur la construction d'expressions peut consulter @ih dans le livre de recettes JSL : Insérer une expression dans une autre en utilisant Eval Insert, Eval Expr, Parse et Substitute
Je bois si je dois ajouter à la "Liste de souhaits JMP" que la Slider Box() ait la possibilité d'avoir une Number Edit Box() connectée, ou qu'un nouvel objet d'affichage soit créé pour cette fonction.
Cool! Vous pouvez définir le contenu d'une zone de texte sans la recréer, ce qui facilite la lecture de l'exemple :
k = 1;
_nw = New Window( "Slider Number Edit Box",
_vlb = V List Box(
SliderNumberEditBox(
"_neb1",
Char( k ),
"_sb1",
"0",
"2",
"k",
"_tb << settext(\!"The number is \!" || char(k))",
"_tb << settext(\!"The number is \!" || char(k))"
),
_tb = Text Box( "The number is " || Char( k ) )
)
);