Problema
En muchas situaciones, cuando usa un cuadro deslizante para controlar una variable numérica, también desea una pantalla numérica editable para mostrar el valor de la variable, y eso le permite establecer manualmente el valor de la variable.
La forma actual de hacer esto es crear dos objetos de visualización: un cuadro de edición de número() y un cuadro deslizante().Tienes que codificar esto de tal manera que estén conectados.Además, la forma en que el cuadro de edición de números interactúa con los cambios en los valores ingresados manualmente (usando <
A menudo tengo que tomarme mucho tiempo leyendo la guía de secuencias de comandos sobre cómo crear estos objetos y cómo conectarlos. (Desearía que hubiera un objeto de visualización JMP integrado como este)
Solución
Creé una función SliderNumberEditBox() que crea una expresión evaluada que crea ambos cuadros de visualización juntos. Estas cajas de visualización se conectarán como se describe anteriormente.Toma como argumentos cadenas de caracteres que definen las referencias al cuadro de edición de números, el valor inicial del cuadro de edición de números, la referencia al cuadro deslizante, el rango superior e inferior del cuadro deslizante, la variable controlada por el control deslizante y, opcionalmente, la expresión que desea ejecutar cuando el cuadro de edición de números se actualiza manualmente y la expresión que desea ejecutar cuando se cambia el cuadro deslizante.(Tenga en cuenta que las expresiones se deben definir como cadenas de caracteres y se deben usar las secuencias de escape apropiadas para los caracteres reservados que desea entrecomillar dentro de la cadena).
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>La función utiliza la concatenación de cadenas para crear la versión de cadena completa de la expresión para los cuadros de visualización y luego analiza la cadena en una expresión y devuelve la expresión evaluada.
Sintaxis
SliderNumberEditBox( cadena para la referencia al cuadro de edición de número , cadena para el valor inicial del cuadro de edición de número , cadena para la referencia al cuadro deslizante , cadena para el rango inferior del control deslizante , cadena para el rango superior del control deslizante , cadena para la variable controlada por el control deslizante , , )
k = 1;
SliderNumberEditBox(
"_neb1",
Char( k ),
"_sb1",
"0",
"2",
"k")
devuelve la expresión evaluada a continuación
H List Box(
_neb1 = Number Edit Box(
0.5,
<<SET function=""></SET>
Ejemplo
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>crea una ventana que se ve así (cambié el cuadro deslizante a un valor diferente)

Estaba buscando en la comunidad algunos buenos ejemplos del uso de Eval/Eval Expr cuando me encontré con esto y pensé en compartir mi implementación de la función SliderNumberEditBox que usa la creación de expresiones en lugar de la concatenación de cadenas.
Muchos de los argumentos pasados a la función ya no son cadenas y ahora hay un argumento de opción nsName para proporcionar el nombre del espacio de nombres en el que deberían existir las variables (el valor predeterminado es 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>
Cualquier persona interesada en obtener más información sobre la creación de expresiones puede consultar @ih Publicación de JSL en el libro de cocina: Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute
Me pregunto si debo agregar a la "Lista de deseos de JMP" que el Cuadro deslizante () tenga una opción para tener un Cuadro de edición de número () conectado, o que se cree un nuevo objeto de visualización que haga esta función.
¡Fresco! Puede establecer el contenido de un cuadro de texto sin volver a crearlo, lo que hace que el ejemplo sea más fácil de leer:
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 ) )
)
);