BookmarkSubscribe
Choose Language Hide Translation Bar
CaseyL
New Contributor

JSL button box: fix variables at time of button creation

My script creates a list of buttons using a for loop. each button calls a function "RepGen" which needs the button's name for an input. The button's behavior doesn't seem to be evaluated until the button is pressed though, at which time the for loop has overwritten the variable containing the button name. Is there a way to evaluate this variable at the time the button is created instead of when it is pressed? Or is there a better way to do this?

 

dtSum = dt << Summary( Group( :ColX ) );
For( i = 1, i <= N Rows( dtSum ), i++,
	varName = dtSum:ColX[i];
	obparts << append( Button Box( varName, RepGen( varName ) ) );
);
0 Kudos
1 ACCEPTED SOLUTION

Accepted Solutions
vince_faller
Super User

Re: JSL button box: fix variables at time of button creation

Using Eval(EvalExpr()) or Eval(Substitute()) will let you make runtime variables static.  Check the scripting index for examples how to use them.  

 

Names Default to Here( 1 );

RepGen = function({btn_name}, 
	{DEFAULT LOCAL},
	print(btn_name);
);

vlb = Vlistbox();
btns = {"Btn 1", "Other", "Button 2 (or3)"};

for(i=1, i<=nitems(btns), i++, 
	vlb << Append(
		Eval(
			//run just this block to show that the buttons are getting evaluated at creation time
			EvalExpr(
				Buttonbox(btns[i], RepGen(Expr(btns[i])))//the expr will evaluate inside the evalexpr
			)
		)
	)
);
new window("Test", 
	vlb
);
Vince Faller - Predictum
1 REPLY 1
vince_faller
Super User

Re: JSL button box: fix variables at time of button creation

Using Eval(EvalExpr()) or Eval(Substitute()) will let you make runtime variables static.  Check the scripting index for examples how to use them.  

 

Names Default to Here( 1 );

RepGen = function({btn_name}, 
	{DEFAULT LOCAL},
	print(btn_name);
);

vlb = Vlistbox();
btns = {"Btn 1", "Other", "Button 2 (or3)"};

for(i=1, i<=nitems(btns), i++, 
	vlb << Append(
		Eval(
			//run just this block to show that the buttons are getting evaluated at creation time
			EvalExpr(
				Buttonbox(btns[i], RepGen(Expr(btns[i])))//the expr will evaluate inside the evalexpr
			)
		)
	)
);
new window("Test", 
	vlb
);
Vince Faller - Predictum