ProblemSie müssen einen benutzerdefinierten Taschenrechner erstellen, der eine Zahlentabelle basierend auf mehreren Eingabewerten anzeigt.
LösungVerwenden Sie Number Edit Boxes, um die Werte abzurufen, und verwenden Sie die Set Function-Methode, um JSL an die Number Edit Boxes anzuhängen, um die Tabelle neu zu berechnen, wenn die Werte geändert werden. Verwenden Sie eine Tabellenbox, um Spalten mit Zahlen zu halten. Erstellen Sie die Zahlenspalten neu, wenn sich die Werte ändern.
if( jmpversion()<"13", Open Log(1); throw("benötigt JMP 13 oder höher")); // Benötige Standardwerte, um die Bearbeitungsfelder einzurichten. Borrow = 1e5; Jahre = 2; April = 15; cur = "USD"; // "EUR" New Window( "table demo", Border Box( Left( 5 ), Right( 5 ), bottom( 5 ), // diese Box erweitert das blassgrüne ein paar Pixel V List Box( // border boxes brauche ein einzelnes untergeordnetes Element, wie eine vlist, um alles zu halten Border Box( Left( 20 ), Right( 20 ), top( 10 ), bottom( 10 ), // die Dateneingabegrenze H List Box( // Trenne die Daten Eingabefelder aus dem Titel "Interessant" V List Box( // die drei vertikalen Eingabefelder und ihre Labels H List Box( // ein Feld und sein Label Number Edit Box( // ein Feld ausleihen, < 12, Monat -= 12; Jahr += 1; ); Daten[i ] = Datum DMY( Tag, Monat, Jahr ); Monat += 1; ); While( !Is Empty( tb << child ), (tb << child) << delete ); // vorherige Daten entfernen, falls vorhanden // neue Spalten zur Tabelle hinzufügen tb << append( Number Col Box( "Fälligkeitsdatum", Daten, <Ich bin kein Finanztyp. Gehen Sie nicht davon aus, dass ich die Formeln richtig verwende. Ich habe mich für Grüntöne entschieden und einige Tischbox-Parameter angegeben, um den Tisch attraktiv zu machen. Ich bin kein Künstler, das können Sie besser. Das grüne Abstandskästchen bildet einen schönen Farbbalken und füllt die Seite, ohne die Seite breiter zu machen, indem die Optionen „AutoStretching“ und „MaxSize“ verwendet werden. Die Funktion freshen() wird von allen drei Dateneingabefeldern aufgerufen und kümmert sich nicht darum, welches Feld sich geändert hat. Sie könnten etwas Komplizierteres machen, aber wenn Sie nicht wirklich langsame Berechnungen haben, halten Sie es einfach. Sie können mit der rechten Maustaste auf die Tabelle klicken und sie in eine Datentabelle umwandeln, um die Daten weiter zu verarbeiten; Sie möchten vielleicht eine Möglichkeit, die Parameter mit der Datentabelle zu speichern (vielleicht eine andere Schaltfläche, um die Datentabelle zu erstellen). Sie können den Bericht auch protokollieren, der die Parameter enthält.
Siehe auchHelp->Books->Scripting Guide enthält weitere Informationen zu Table Boxes
Begann Anfang 2021 mit dem Scripting und dieser Beitrag war wirklich nützlich. Ich habe den größten Teil des obigen Skripts kopiert und für meinen eigenen Taschenrechner modifiziert, dessen Ausgabe ich auf einer anderen Plattform verwenden möchte.
Allerdings bin ich mit dem Erreichten nicht ganz zufrieden. Wenn ich mein Skript zum ersten Mal öffne und ausführe, erhalte ich zwei vorausgefüllte Zahlenfelder, in die ich Werte eingeben kann.

Erst wenn ich einen der Werte in den vorausgefüllten Zahlenfeldern ändere, erscheint das dritte Feld mit dem Ergebnis, das mich eigentlich weiter verwenden möchte.

Ich glaube, ich bin darauf gestoßen, weil das, was ich erstellt habe, auf dem von bereitgestellten Code basiert @Craige_Hales über.
- Wie kann ich es schaffen, dass das dritte Feld (oben rot eingekreist) von Anfang an erscheint, aber auch basierend auf den Eingabewerten in den anderen beiden Feldern aktualisiert wird?
- Gibt es eine effizientere Lösung zum Bau eines kleinen Taschenrechners oder verwende ich einen unnötig komplizierten Ansatz?
An dieser Stelle wollte ich auch erwähnen, dass ich zwar sowohl den Scripting Guide als auch den Scripting Index studiert habe, aber noch nicht stark genug als Scripter bin, um auf eine eigene Lösung zu kommen. (Ich habe "Jump into JMP Scripting" jedoch nicht durchsucht, da ich derzeit keinen Zugriff auf meine Kopie habe.)
Names default to here ( 1 );
// some default values for the first two number edit boxes
CurrentConc_wt% = 45.00;
LowestAcceptConc_wt% = 40.00;
New Window( "Calculating Concentration acceptance limit",
Border Box(Left( 5 ), Right( 5 ), bottom( 20 ),
V List Box(
Text Box("Some comment")
)
),
Border Box(Left( 5 ), Right( 5 ), bottom( 20 ),
V List Box(
Text Box("Instructions: [add instructions here later]")
)
),
Border Box(Left( 5 ), Right( 5 ), bottom( 5 ), // added this because I copied this code and left in there, just in case...
V List Box( // border boxes need a single child, like a vlist, to hold everything
Border Box(Left( 5 ), Right( 5 ), bottom( 5 ), // border for data entry boxes
H List Box(
V List Box(
Border Box(Left( 5 ), Right( 5 ), bottom( 5 ),
H List Box(
Number Edit Box(
CurrentConc_wt%,
<<SETFORMAT></SETFORMAT>
Es wird noch eine Weile dauern, bis ich das genauer betrachten kann. Aber ich denke, Sie vermissen vielleicht nur den Aufruf ganz am Ende der ursprünglichen JSL, freshen() , der da war, um alle Kästchen zu initialisieren, als ob bereits etwas angeklickt worden wäre.
Danke, das war eine einfache Lösung. Vielleicht gibt es doch Grund zur Zufriedenheit.