Wie generiert man Buttons innerhalb einer Schleife?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich versuche, Schaltflächen innerhalb einer Schleife zu generieren (eine Schaltfläche für jede Spalte). Die Schaltflächen werden korrekt erstellt, außer dass, wenn die Schaltfläche ihr Skript ausführt, immer das Skript der zuletzt erstellten Schaltfläche ausgeführt wird - anstelle des Skripts, das bei der Erstellung an das Schaltflächenfeldobjekt übergeben wurde.
Es scheint also, dass die Schaltfläche nur einen Verweis auf das Skript erhält - und wenn das Skript geändert wird, ändert die Schaltfläche ihre Funktion. Ich habe versucht, eine Problemumgehung mit einem Array von Skripts in Betracht zu ziehen, aber das Problem ist, dass ich kein Argument für das Schaltflächenobjekt übergeben kann (z. B. indizieren, welches Skript im Array ausgeführt werden soll).
Frage: Gibt es in jsl eine Möglichkeit, Schaltflächen innerhalb einer Schleife mit unterschiedlichen Skripten/Verhalten zu erstellen? Gibt es zB eine Möglichkeit, Argumente/Daten an das Schaltflächenobjekt zu übergeben, wenn es erstellt wird???
Mein Code:
NamesDefaultToHere(1);
dt = Aktuelle Datentabelle ();
dtCols = dt << Spaltennamen abrufen (Numerisch, Kontinuierlich);
// Ausdruck zum Anzeigen der Verteilung für strParam
Ausdr_ShowDistribution = Ausdr(
Neues Fenster( Char(strParam),
Verteilung(
Kontinuierliche Verteilung (
Column( strParam ) //Wir spezifizieren unseren Parameter
),
SendToReport(
Dispatch( {}, "Distribution", OutlineBox, Set Title( "" ) ),
)
)
)
);
// Hauptfenster
Neues Fenster ("Hauptfenster",
ob = OutlineBox("Schaltflächen",
TextBox ("Debug-Schaltflächen", Schriftstil festlegen ("Fett"))
);
);
// Schaltfläche erstellen, die nur ins Log ausgibt
BB = Button Box( "ClickMe", Show("Clicked"));
ob << Append(BB);
// Erstellen Sie Schaltflächen zum Anzeigen von Verteilungen
For( i = 1, i <= NItems(dtCols), i++,
Expr_ButtonAction = Substitute(NameExpr(Expr_ShowDistribution),
Ausdr(strParam), Eval(Char(dtSpalten )) );
Show(NameExpr(Expr_ButtonAction)); // Der Ausdruck ist für jede Schaltfläche unterschiedlich.
BB = Button Box( Char(dtCols ), Eval(Expr_ButtonAction));
ob << Append(BB);
);
Re: Wie erzeuge ich Buttons innerhalb einer Schleife?Ihr Beispiel sollte funktionieren, wenn die letzten beiden Zeilen innerhalb der Schleife, dh
BB = Button-Box ( Verkohlen ( dtCols [ ich ]) , Bewertung ( Expr_ButtonAction )) ;
ob << Anhängen ( BB ) ;
werden durch ersetzt
Bewertung ( Bewertungsausdr ( ob << Anhängen ( Button-Box ( Verkohlen ( dtCols [ ich ] ) , Ausdruck ( Name Ausdruck ( Expr_ButtonAction ) ) ) ) ) ) ;
Nicht die offensichtlichste Lösung. Hier denke ich, dass der Ansatz der "String-Manipulation" wie im Beispiel von PMroz einfacher ist.
Re: Wie erzeuge ich Buttons innerhalb einer Schleife?Gute Idee, aber nicht umgesetzt.Im Moment würde ich vorschlagen, den Namen der Schaltfläche als Schlüssel für ein assoziatives Array zu verwenden.
Re: Wie erzeuge ich Buttons innerhalb einer Schleife?Der Setze Funktion() Der Ansatz scheint nützlicher zu sein, wenn ich einige Benutzerdaten an die Schaltfläche anhängen könnte, z. B. durch Hinzufügen von Schlüssel-Wert-Paaren zu einem assoziativen Array.Ist das möglich?
Re: Wie erzeuge ich Buttons innerhalb einer Schleife?Ein Schaltflächenskript kann eine Funktion mit einem "this"-Parameter sein, der sich auf die Schaltfläche bezieht, was bedeutet, dass die Schaltfläche ihren Namen oder ihr übergeordnetes Feld finden kann.
Neues Fenster( "Beispiel", v = V Listenfeld() );
f = Function( {this}, Show( this << getbuttonname ) );
Für( i = 1, i < 10, i++,
v << append( Button Box( "number" || Char( i ), Set Function( f ) ) )
);

Der Parameter „Set Function“ ist der Schlüssel, damit dies funktioniert.In Ihrem Beispiel denke ich, dass die Schaltflächennamen die Spaltennamen sein könnten.Die VListBox im Beispiel hat den Namen "v", sodass Schaltflächenboxen daran angehängt werden können.
Re: Wie erzeuge ich Buttons innerhalb einer Schleife?Hier ist eine Implementierung, die funktioniert.Ich habe den Verteilungsausdruck in eine Funktion geändert und musste dann mit evalinsert, parse, eval spielen, damit es funktioniert.
Showverteilung = Funktion ({ Spaltenname } , { Standardlokal } ,
dist_expr = evalinsert (
"\[Verteilung( Nominalverteilung( Spalte(:name("^Spaltenname^")) ) )]\" ) ;
auswerten ( analysieren ( dist_expr )) ;
) ;
// Hauptfenster
Neues Fenster ( "Hauptfenster" ,
ob = OutlineBox ( "Tasten" ,
Textfeld ( "Debugging-Schaltflächen" , Schriftstil festlegen ( "Deutlich" ))
) ;
) ;
// Schaltfläche erstellen, die nur ins Log ausgibt
BB = Button-Box ( "Klick mich" , Zeigen ( "angeklickt" )) ;
ob << Anhängen ( BB ) ;
dt = offen ( "$sample_data\Große Klasse.jmp" ) ;
dtcols = dt << Spaltennamen erhalten ( Schnur ) ;
für ( ich = 1 , ich <= Gegenstände ( dtcols ) , ich ++,
button_expr = evalinsert ( "\[one_button = Schaltflächenfeld("^dtcols ^", showdistribution("^dtcols ^"))]\" ) ;
auswerten ( analysieren ( button_expr )) ;
ob << anhängen ( one_button ) ;
) ;