Our World Statistics Day conversations have been a great reminder of how much statistics can inform our lives. Do you have an example of how statistics has made a difference in your life? Share your story with the Community!
Choose Language Hide Translation Bar
Highlighted

## For Loop inside a tab box where each loop creates a different tab in the window

I'm attempting to loop through a variable list of tools (ChamberTool or Cham) to create a list.  Then using that list I create a contour of the data by date where each chamber is a separate tab on a tab box window.  I've done each of these things independently but my particular issue is creating a tab for each tool from this variable list.  Maybe my approach is way off but here is my script.

First, here are the two bits of script I have that work.  I hand wave over the scripting of the parts that I already know how to do and to keep this post more brief and not detract from my main problem statement.

``````ContourG = dt << Contour stuff here;

Graph = new window("Contours", tab box(
"Tab Name Here", (vlistbox(ContourG)),
));``````

But when i try to run a for loop i am completely broken.

``````Cham = Associative Array(Column(dt_stacked, "Chamber") << Get Values) << Get Keys;Associative Array(Column(dt_stacked, "Chamber")<< Get Values)<<Get Keys;

Graph = new window("Contours", tab box(
For (x=1, x<=nitems(Cham), x++,
ChamberTool= Cham[x];
G_Contour = Cham[x];
ContourG = dt_stacked << Contour Plot(
X( :XLoc, :YLoc ),	Y( :Thickness ),
Where( :Chamber == ChamberTool ),	By(:Date),
Chart Parameter stuff here,	SendToReport( other stuff here)	),
ChamberTool, (vlistbox(ContourG)),
)));``````
11 REPLIES 11
Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

The syntax you are using to create the new tabs is not correct;  Below is the example taken directly from the Scripting Index, on how to add a new tab.  Infact, the example shows 2 ways to do that.  Your code only generates one tab.

``````Names Default To Here( 1 );
New Window( "Example",
tb = Tab Box(
Tab Page Box(
"First Tab",
Tip( "First Tab Tooltip" ),
Button Box( "Press One" )
),
Tab Page Box(
"Second Tab",
Closeable( 1 ),
Button Box( "Press Two" )
),
Tab Page Box(
"Third Tab",
Icon( "Nominal" ),
Button Box( "Press Three" )
)
)
);
Wait( 1 );
"Fourth Tab",
Button Box( "Press Four" )
);``````
Jim
Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

@txnelson, my code was my attempt to create a loop, based on a variable list, to have each discrete item in the list be its own tab.  The example you gave looks like a way to hard code a specific number of tabs but in my case the number of tabs would change.  For example, if my dataset one day has 5 distinct entities in my list then my code should generate 5 tabs, one for each entity.  But the next day my dataset might be 8 entities.

And an unrelated question, any ide how i can update my email address on my account?  I realized that my account is tied to an address that I no longer have access to and I can't for the life of me figure out how to update it.

Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

My previous post was not completly hard wired.  It showed both a hard coded method, and a method that would allow you to decide to add tabs whenever you needed to.  But to make it more direct, here is a reworked script that uses a JSL list to determine the tabs that need to be added

``````Names Default To Here( 1 );

tabList = {"First", "Second", "Third", "Fourth"};
New Window( "Example", tb = Tab Box() );

For( i = 1, i <= N Items( tabList ), i++,
tabList[i] || " Tab",
Button Box( "Press " || tabList[i] )
)
);``````
Jim
Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

Is that possible dynamically create a 2nd layer of Tab Boxes, my data has multi-layers of data, thank you.

``````Names Default To Here( 1 );

tabList = {"First", "Second", "Third", "Fourth"};
New Window( "Example", tb = Tab Box() );

For( i = 1, i <= N Items( tabList ), i++,
tabList[i] || " Tab",                      //another layer of tabs goes here
Button Box( "Press " || tabList[i] )
)
);``````

Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

Building on Jim's example:

``````NamesDefaultToHere(1);

// Make two lists that will define the two-level hierarchical tab structure
nFirst = 4;
nSecondMax = 5;
tabListFirst = {};			// A List
tabListSecond = {};			// A list of lists
for(i=1, i<=nFirst, i++,
InsertInto(tabListFirst, "Tab "|| Char(i));
secondList = {};
for(ii=1, ii<=randomInteger(1, nSecondMax), ii++,
InsertInto(secondList, "Tab "|| Char(ii))
);
InsertInto(tabListSecond, evalList(List(secondList)));
);

// Use these lists to build the UI
tb = Tab Box();
For( i = 1, i <= N Items( tabListFirst ), i++,
tb2 = TabBox();
for(ii = 1, ii <= NItems(tabListSecond[i]), ii++,
tabListSecond[i][ii] || " Tab",
Button Box( "Press " || tabListSecond[i][ii] )
);
);
tb << Add(tabListFirst[i] || " Tab", tb2);
);
New Window( "Example", tb );``````
Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

Thank you, that is exactly what i am looking for, my data has 4 level, and number of tab on the next level is based on tab value from previous level..
Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

4 level tab box example:

``````Names Default To Here( 1 );

// Make multiple lists that will define the multi-level hierarchical tab structure
nFirst = 5;
nSecondMax = 5;
nThirdMax = 5;
nForthMax = 5;

tabListFirst = {};			// first lists
tabListSecond = {};			// second lists
tabListThird = {}; 			// third lists
tabListForth = {}; 			// forth lists

For( i = 1, i <= nFirst, i++, //first level
Insert Into( tabListFirst, " L1 Tab " || Char( i ) );
secondList = {};
For( ii = 1, ii <= nSecondMax, ii++, //second level
Insert Into( secondList, "L2 Tab " || Char( ii ) );
thirdList = {};
For( iii = 1, iii <= nThirdMax, iii++,//third level
Insert Into( thirdList, "L3 Tab " || Char( iii ) );
forthList = {};
For( iiii = 1, iiii <= nForthMax, iiii++,//forth level
Insert Into( forthList, "L4 Tab " || Char( iiii ) )
);
Insert Into( tabListForth, Eval List( List( forthList ) ) );
);
Insert Into( tabListThird, Eval List( List( ThirdList ) ) );
);
Insert Into( tabListSecond, Eval List( List( secondList ) ) );
);
/*
Show( tabListFirst );
Show( tabListSecond );
Show( tabListThird );
Show( tabListForth );
*/

// Use these lists to build the UI
tb = Tab Box(); //first level of Tab Box
For( i = 1, i <= N Items( tabListFirst ), i++,
tb2 = Tab Box(); //second level of Tab Box
For( ii = 1, ii <= N Items( tabListSecond[i] ), ii++,
tb3 = Tab Box();  //third level of Tab Box
For (iii = 1, iii <= NItems ( tabListThird[ii]), iii++,
tb4 = Tab Box();
For (iiii = 1, iiii <= NItems ( tabListForth[iii]), iiii++,
tb4 << Add( tabListForth[iii][iiii] || " Tab",
Text Box( tabListFirst[i] ||"->"|| tabListSecond[ii][iii] ||"->"|| tabListThird[ii][iii] ||"->"|| tabListForth[iii][iiii]) )
);
tb3 << Add(tabListThird[ii][iii] || " Tab", tb4);
);
tb2 << Add ( tabListSecond[i][ii] || " Tab", tb3);
);
tb << Add( tabListFirst[i] || " Tab", tb2 );
);
New Window( "Example", tb );
``````
Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

``Text Box( tabListFirst[i] ||"->"|| tabListSecond[ii][iii] ||"->"|| tabListThird[ii][iii] ||"->"|| tabListForth[iii][iiii]) )`-->`
``Text Box( tabListFirst[i] ||"->"|| tabListSecond[i][ii] ||"->"|| tabListThird[ii][iii] ||"->"|| tabListForth[iii][iiii]) )``

minor update......

Highlighted

## Re: For Loop inside a tab box where each loop creates a different tab in the window

Of course there are lots of ways to design a UI. But with a four level hierarchy, I would consider using a local data filter with the 'conditional' option:

``````// Conditional (hierarchical) local data filter

Names Default To Here( 1 );

dt = Open( "\$SAMPLE_DATA/Big Class.jmp" );

gb = dt << Graph Builder(
Size( 529, 563 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
Local Data Filter(
Conditional,