Este código sirve para elegir opciones con el cursor en un menú multicolumna:
'Menucol.bas Ray Thomas January 2002
OPTION BASE 1
DIM MenuItem(60) AS STRING * 15 'Define the menu item array
DIM ChooseItem AS INTEGER 'Currently chosen menu item
DIM XMenuPosn AS INTEGER 'Controls the menu item X positions
DIM YMenuPosn AS INTEGER 'Controls the menu item Y positions
DIM Count AS INTEGER 'Array counter
DIM MenuLine AS INTEGER 'Number of menu items per line
DIM Temp AS STRING 'Used to centre text in the space
DATA Choice 1, Choice 2, Choice 3, Choice 4, Choice 5
DATA Choice 6, Choice 7, Choice 8, Choice 9, Choice 10
DATA Choice 11, Choice 12, Choice 13, Choice 14, Choice 15
DATA Choice 16, Choice 17, Choice 18, Choice 19, Choice 20
DATA Choice 21, Choice 22, Choice 23, Choice 24, Choice 25
DATA Choice 26, Choice 27, Choice 28, Choice 29, Choice 30
DATA Choice 31, Choice 32, Choice 33, Choice 34, Choice 35
DATA Choice 36, Choice 37, Choice 38, Choice 39, Choice 40
DATA Choice 41, Choice 42, Choice 43, Choice 44, Choice 45
DATA Choice 46, Choice 47, Choice 48, Choice 49, Choice 50
DATA Choice 51, Choice 52, Choice 53, Choice 54, Choice 55
DATA Choice 56, Choice 57, Choice 58, Choice 59, Choice 60
ChooseItem = 1 'Starting point of highlighted menu item
XMenuPosn = 10 'X starting point of menu
YMenuPosn = 3 'Y starting point of menu
MenuLine = 4 'Number of columns in the menu
'*** Fill the MenuItme Array ***
FOR Count = 1 TO UBOUND(MenuItem$)
READ Temp$
'*** Centre the Text ***
Temp$ = SPACE$((15 - LEN(Temp$)) / 2) + Temp$
MenuItem(Count) = Temp$
NEXT Count
CLS
GOSUB DrawMenu
'*** get cursor key movements and redraw menu ***
DO
Cmmnd$ = INKEY$
IF LEN(Cmmnd$) = 2 THEN Cmmnd$ = RIGHT$(Cmmnd$, 1)
IF Cmmnd$ = "8" OR Cmmnd$ = CHR$(72) THEN GOSUB MoveUp
IF Cmmnd$ = "2" OR Cmmnd$ = CHR$(80) THEN GOSUB MoveDown
IF Cmmnd$ = "4" OR Cmmnd$ = CHR$(75) THEN GOSUB Moveleft
IF Cmmnd$ = "6" OR Cmmnd$ = CHR$(77) THEN GOSUB MoveRight
IF Cmmnd$ = "9" OR Cmmnd$ = CHR$(73) THEN GOSUB TopCol
IF Cmmnd$ = "3" OR Cmmnd$ = CHR$(81) THEN GOSUB BottomCol
IF Cmmnd$ = "7" OR Cmmnd$ = CHR$(71) THEN ChooseItem = 1
IF Cmmnd$ = "1" OR Cmmnd$ = CHR$(79) THEN ChooseItem = UBOUND(MenuItem$)
GOSUB DrawMenu
LOOP UNTIL Cmmnd$ = CHR$(13)
PRINT
COLOR 16, 10
PRINT "Item chosen ="; MenuItem(ChooseItem)
END:
DrawMenu:
'Draw the menu
LOCATE YMenuPosn, XMenuPosn
FOR Count = 1 TO UBOUND(MenuItem$)
IF Count = ChooseItem THEN COLOR 4, 2 ELSE COLOR 2, 4
PRINT MenuItem$(Count);
IF Count MOD MenuLine = 0 THEN
PRINT
LOCATE CSRLIN, XMenuPosn
END IF
NEXT Count
RETURN
MoveUp:
IF ChooseItem <= MenuLine THEN
ChooseItem = UBOUND(MenuItem$) - (MenuItem MOD MenuLine)
ELSE
ChooseItem = ChooseItem - MenuLine
END IF
RETURN
MoveDown:
IF ChooseItem > UBOUND(MenuItem$) - MenuLine THEN
ChooseItem = ChooseItem MOD MenuLine
ELSE
ChooseItem = ChooseItem + MenuLine
END IF
IF ChooseItem = 0 THEN ChooseItem = MenuLine
RETURN
Moveleft:
ChooseItem = ChooseItem - 1
IF ChooseItem = 0 THEN ChooseItem = UBOUND(MenuItem$)
RETURN
MoveRight:
ChooseItem = ChooseItem + 1
IF ChooseItem = UBOUND(MenuItem$) + 1 THEN ChooseItem = 1
RETURN
TopCol:
ChooseItem = ChooseItem MOD MenuLine
IF ChooseItem = 0 THEN ChooseItem = MenuLine
RETURN
BottomCol:
ChooseItem = UBOUND(MenuItem$) - (MenuLine - (ChooseItem MOD MenuLine))
IF MenuLine - (ChooseItem MOD MenuLine) = MenuLine THEN ChooseItem = UBOUND(MenuItem$)
RETURN
(http://brisray.com/qbasic/menucol.gif)