Erstellen eines Schaltflächenskripts in einer for-SchleifeIch versuche, eine Tabellenbox mit einer Reihe von Zeilen zu generieren, die variabel sein werden. Ich möchte, dass jede Zeile eine Schaltfläche hat, die eine Funktion für eine entsprechende Variable in einer Liste ausführt.
Aktuelles Problem: Die Skripte in der for-Schleife interpretieren eval expr nicht wie erwartet. Das resultierende Skript, das an jedes Kontrollkästchen angehängt ist, sollte drucken, dass Schaltfläche 1, 2 oder 3 gedrückt wurde. Stattdessen steht immer 4. Endziel ist es, eine Operation auf UserText[i] durchzuführen, wenn das Kontrollkästchen angeklickt wird.
Kann mir jemand erklären, was ich falsch mache? Danke schön!
Bonusfrage: Ich verwende Kontrollkästchen, weil sie kleiner als Schaltflächenfelder sind und Schaltflächenfelder nicht in der Größe veränderbar zu sein scheinen. Idealerweise wären es nur kleine anklickbare Symbole. Gibt es eine benutzerfreundliche Möglichkeit, anstelle einer vollständigen Schaltfläche ein kleines klickbares "x" zu erstellen?
JMP-Version: 16
Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box(
Col Box( "Text", {} ),
Col Box( "Button", {} ),
),
tb << set row borders(1);
);
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>SkripterstellungBetreff: Erstellen eines Button-Skripts in einer for-SchleifeHallo,
Du warst ganz in der Nähe.
Wenn Sie Eval ( EvalExpr ( ) ) verwenden, um die gesamte Anweisung tb << add row () wie unten zu umschließen, erhalten Sie das gewünschte Verhalten:
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
eval(evalexpr(
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>Betreff: Erstellen eines Button-Skripts in einer for-SchleifeHier ist meine alte Art, damit umzugehen
Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box(
Col Box( "Text", {} ),
Col Box( "Button", {} ),
),
tb << set row borders(1);
);
//for loop to add a number of rows with a small button next to each one
For( i = 1, i <= N Items( UserText ), i++,
tb << add row(
{Text Box( UserText[i], <<SET width=""></SET>Betreff: Erstellen eines Button-Skripts in einer for-SchleifeMeine Methode ist mit XPath und Contains() etwas komplizierter, aber in einigen Fällen ist sie möglicherweise robuster (und Sie können sie auf andere Elemente neben Checkbox erweitern, wenn Sie den XPath ändern).
Names Default To Here(1);
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window("Select files",
tb = Table Box(Col Box("Text", {}), Col Box("Button", {}), Col Box("Third", {})),
tb << set row borders(1)
);
expr_tablebox_get_checkbox_idx = Expr(
row_idx = Contains((this << parent) << XPath("//CheckBoxBox"), this);
);
expr_tablebox_get_column_idx = Expr(
col_idx = Contains(((this << parent) << parent) << Get Names, (this << parent) << get heading)
);
expr_check_box = Expr(
expr_tablebox_get_checkbox_idx;
expr_tablebox_get_column_idx;
Show(row_idx, col_idx);
);
For Each({txt}, UserText,
tb << Add Row(
{Text Box(txt, << Set Width),
cb = Check Box({""}, << Set Function(function({this},
expr_check_box
))
),
cb = Check Box({""}, << Set Function(function({this},
expr_check_box
))
)
};
);
);
</CODE>Wenn Sie diese Methode verwenden, können Sie auf einige Probleme stoßen, bei denen Ausdrücke korrekt ausgewertet werden, je nachdem, wo Sie sie aufrufen, daher sollte dies nicht die erste Methode sein, die Sie ausprobieren sollten</P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-601493" slang="en-US" mode="NONE">Betreff: Erstellen eines Button-Skripts in einer for-Schleife</LINGO-SUB><LINGO-BODY id="lingo-body-601493" slang="en-US" mode="NONE"><P>Ich kam zurück, als ich gestern Abend dachte, "das geht auch mit Xpath und enthält". Jarmos Post war bereits hier; Das Beispiel, das ich unten aufgeführt habe, ist ziemlich ähnlich, weist aber alle Checkbox-Funktionen auf einmal mit einer Xpath-Anweisung zu, sobald Sie die Tabelle erstellt haben. Dies wird zu einer meiner Lieblingsmethoden, um mit dieser Art von Dingen umzugehen.</P>
<P> </P>
<PRE><CODE class=" language-jsl">Names Default To Here( 1 );
UserText = {"default 1", "default 2", "default 3"};
win2 = New Window( "Select files",
tb = Table Box( Col Box( "Text", {} ), Col Box( "Button", {} ), << set row borders(1) );
);
//add rows with a small button next to each one
For each ( { txt, i }, UserText,
tb << add row( {Text Box( txt, <<SET width=""></SET>
Betreff: Erstellen eines Button-Skripts in einer for-SchleifeDanke schön! Ich muss etwas mehr Zeit damit verbringen, dies zu verstehen, ich habe die set-Funktion nicht verwendet und verstehe das Verhalten nach einem kurzen Lesen des Skriptleitfadens und einiger Beispiele nicht ganz. Ich sehe eine Situation voraus, in der ich eine solche Funktionalität benötige, also werde ich dies für eine Weile in Erinnerung behalten und zurückkommen, wenn es soweit ist.
Um etwas Grundlegendes zu bestätigen, das im Material nicht ausdrücklich angegeben zu sein scheint: Ist "this" beim Definieren einer Funktion ein vordefinierter Begriff in JSL, der auf das Objekt verweist, an das die Funktion angehängt ist? Ich sehe einige Beispiele, die „this“ im Set-Funktionsargument verwenden, ohne dass es irgendwo anders in der Funktionsdefinition vorkommt (ich bin mir zu etwa 60 % sicher, dass ich die richtigen Begriffe verwende). Die grundlegenden mathematischen Funktionen sind intuitiv, wie z. B. MyFn = Funktion ({x,y}, x + y ), aber dann scheinen die Dinge sehr schnell an Komplexität zuzunehmen, wenn wir uns mit Objekten befassen.
Betreff: Erstellen eines Button-Skripts in einer for-SchleifeEs ist nur der erste Parameter, wenn es mit << Set Function verwendet wird (wie es nicht sein muss Das , scheint, als ob der Skriptindex JMP17 verwendet wird Diese Box Zum Beispiel). Und dieses erste Argument ist ein Verweis auf das spezifische Feld, in dem diese Funktion festgelegt ist.Diese Hilfeseite enthält möglicherweise weitere Informationen mit einigen Beispielen:
Skriptleitfaden > Baumstrukturen anzeigen > Benutzerdefinierte Fenster konstruieren > Funktion festlegen und Skript festlegen
Außerdem können Sie bei einigen Anzeigefeldern möglicherweise mehrere Parameter mit << Set Function verwenden. Sie können diese im Scripting-Index sehen (wenn Sie sie finden können, könnte das manchmal etwas schwierig sein)
