Problem
Wenn Sie zum Steuern einer numerischen Variablen ein Schiebereglerfeld verwenden, möchten Sie in vielen Situationen auch eine bearbeitbare Zahlenanzeige, um den Wert der Variablen anzuzeigen und die es Ihnen ermöglicht, den Wert der Variablen manuell festzulegen.
Der aktuelle Weg, dies zu tun, besteht darin, zwei Anzeigeobjekte zu erstellen: eine Number Edit Box() und eine Slider Box().Diese muss man so kodieren, dass sie zusammenhängen.Darüber hinaus unterscheidet sich die Art und Weise, wie das Zahlenbearbeitungsfeld mit Änderungen an manuell eingegebenen Werten interagiert (mithilfe von <
Ich muss mir oft viel Zeit nehmen, um die Skriptanleitung zu lesen, die erklärt, wie man diese Objekte erstellt und wie man sie verbindet. (Ich wünschte, es gäbe ein integriertes JMP-Anzeigeobjekt wie dieses)
Lösung
Ich habe eine Funktion SliderNumberEditBox() erstellt, die einen ausgewerteten Ausdruck erstellt, der beide Anzeigefelder zusammen erstellt. Diese Displayboxen werden wie oben beschrieben angeschlossen.Als Argumente werden Zeichenfolgen verwendet, die die Verweise auf das Zahlenbearbeitungsfeld, den Anfangswert für das Zahlenbearbeitungsfeld, den Verweis auf das Schiebereglerfeld, den oberen und unteren Bereich für das Schiebereglerfeld und die Variable definieren, die vom Schieberegler gesteuert wird und optional den Ausdruck, den Sie ausführen möchten, wenn das Zahlenbearbeitungsfeld manuell aktualisiert wird, und den Ausdruck, den Sie ausführen möchten, wenn das Schiebereglerfeld geändert wird.(Beachten Sie, dass die Ausdrücke als Zeichenfolgen definiert sein müssen und die entsprechenden Escape-Sequenzen für reservierte Zeichen verwendet werden müssen, die innerhalb der Zeichenfolge in Anführungszeichen gesetzt werden sollen.)
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>Die Funktion verwendet die Zeichenfolgenverkettung, um die gesamte Zeichenfolgenversion des Ausdrucks für die Anzeigefelder zu erstellen, analysiert die Zeichenfolge dann in einen Ausdruck und gibt den ausgewerteten Ausdruck zurück.
Syntax
SliderNumberEditBox( Zeichenfolge für den Verweis auf das Zahlenbearbeitungsfeld , Zeichenfolge für den Anfangswert des Zahlenbearbeitungsfelds , String für den Verweis auf die Slider-Box , Zeichenfolge für den unteren Bereich des Schiebereglers , Zeichenfolge für den oberen Bereich des Schiebereglers , Zeichenfolge für die vom Schieberegler gesteuerte Variable , , )
k = 1;
SliderNumberEditBox(
"_neb1",
Char( k ),
"_sb1",
"0",
"2",
"k")
gibt den ausgewerteten Ausdruck unten zurück
H List Box(
_neb1 = Number Edit Box(
0.5,
<<SET function=""></SET>
Beispiel
SliderNumberEditBox = Function( {nebref, nebinitval, sbref, sblower, sbupper, sbvar, nebFunction = "", sbFunction = ""},
Eval(
Parse(
"H List Box(" || nebref || " = Number Edit Box(" || nebinitval || ",
<<SET function=""></SET>Erstellt ein Fenster, das so aussieht (ich habe das Schiebereglerfeld auf einen anderen Wert geändert)

Ich habe in der Community nach einigen guten Beispielen für die Verwendung von Eval/Eval Expr gesucht, als ich darauf gestoßen bin, und dachte, ich würde meine Implementierung der SliderNumberEditBox-Funktion teilen, die die Ausdruckserstellung anstelle der Zeichenfolgenverkettung verwendet.
Viele der an die Funktion übergebenen Argumente sind keine Zeichenfolgen mehr und es gibt jetzt ein optionales nsName-Argument zum Angeben des Namens des Namespace, in dem die Variablen vorhanden sein sollen (standardmäßig 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>
Jeder, der mehr über Ausdrucksaufbau erfahren möchte, kann hier vorbeischauen @ich h Beitrag im JSL Cookbook: Fügen Sie einen Ausdruck in einen anderen ein, indem Sie Eval Insert, Eval Expr, Parse und Substitute verwenden
Ich frage mich, ob ich der „JMP-Wunschliste“ hinzufügen sollte, dass die Slider Box() eine Option hat, um eine verbundene Number Edit Box() zu haben, oder dass ein neues Anzeigeobjekt erstellt wird, das diese Funktion ausführt.
Cool! Sie können den Inhalt eines Textfelds festlegen, ohne es neu erstellen zu müssen, was die Lesbarkeit des Beispiels erleichtert:
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 ) )
)
);