Creating child controls in a loop
by Richard Russell, March 2013
In Liberty BASIC 4.04 you can use the MAPHANDLE statement to, for example, reuse the same code to open multiple windows. The LB4 documentation illustrates how to open three windows using this technique:
winName$ = "first second third" for x = 1 to 3 call createWindow word$(winName$, x) next x wait sub createWindow title$ texteditor #1.te, 10, 10, 200, 200 open "text "+title$ for window as #1 #1.te "this is the "+title$+" window" #1 "trapclose aboutToClose" handle$ = "#"+title$ maphandle #1, handle$ end sub sub aboutToClose handle$ confirm "Close "+handle$+"?"; answer if answer = 1 then close #handle$ end sub
It would be extremely useful to be able to use MAPHANDLE in a similar fashion to create multiple child controls, but for some reason LB4 will not let you do so. Fortunately this is one of the many limitations that is removed in LB Booster.
The code below is adapted from the Alphabet Buttons example on the Liberty BASIC Community Wiki but instead of using a separate BUTTON statement for each button, all 26 are created in a loop:
Stylebits #win, 0,_WS_MAXIMIZEBOX,0,0 WindowWidth = 230 WindowHeight = 80 UpperLeftX=int((DisplayWidth-WindowWidth)/2) UpperLeftY=int((DisplayHeight-WindowHeight)/2) for i = 1 to 26 x = 15 * i : y = 5 if x > 195 then x = x - 195 : y = y + 15 Button #win.tmp, CHR$(64+i), sel, UL, x, y, 15, 15 maphandle #win.tmp, "#win." + chr$(64+i) next Open "Alphabet Buttons" For Window As #win Print #win, "Trapclose quit" wait sub sel handle$ print "Selected "; handle$ end sub sub quit handle$ close #handle$ end end sub
If you click a button and watch the mainwin you can see that each button has a separate handle, exactly as was the case in the original program.