' ' COUNTRY.BAS ' This program asks the user to select his country from a list. ' The user may press the UP and DOWN arrows or PAGE UP/PAGE DOWN ' or HOME/END keys to navigate the menu. The user may also start ' typing the name of his country to find it faster. ' ' Written by Zsolt Nagy-Perge in October 2018, Pensacola, Fla. ' ' ' QBasic 1.1 source code: ' DEFINT A-Z DECLARE SUB CENTER (TEXTCOLOR, ROW, TEXT$) DECLARE SUB MENU (S, TITLE$, L$, TEXT$) DECLARE FUNCTION GETWORD$ (L$, N, S) SELECTED = 3 LIST$ = "United States of America|Mexico|Canada|United Kingdom|Australia|Afghanistan|Albania|Algeria|Andorra|Angola|Anguilla|Antigua and Barbuda|Argentina|Armenia|Aruba|Austria|Azerbaijan|Bahamas|Bahrain|Bangladesh|Barbados|Belarus|Belgium|Belize|Benin|Bermuda|Bhutan|Bolivia|Bonaire|Bosnia and Herzegovina|Botswana|Brazil|British Virgin Islands|Brunei|Bulgaria|Burkina Faso|Burundi|Cabo Verde|Cambodia|Cameroon|Cayman Islands|Central African Republic|Chad|Chile|China|Clipperton Island|Colombia|Comoros|Costa Rica|Cote d'Ivoire|Croatia|Cuba|Curacao|Cyprus|Czech Republic|Democratic Republic of the Congo|Denmark|Djibouti|Dominica|Dominican Republic|Ecuador|Egypt|El Salvador|Equatorial Guinea|Eritrea|Estonia|Ethiopia|Fiji|Finland|France|French Polynesia|Gabon|Gambia|Georgia|Germany|Ghana|Greece|Greenland|Grenada|Guadeloupe|Guatemala|Guinea|Guinea-Bissau|Guyana|Haiti|Honduras|Hungary|Iceland|India|Indonesia|Iran|Iraq|Ireland|Israel|Italy|Jamaica|Japan|Jordan|Kazakhstan|Kenya|Kiribati|Kosovo|Kuwait|Kyrgyzstan|Laos|Latvia|Lebanon|Lesotho|Liberia|Libya|Liechtenstein|Lithuania|Luxembourg|Macedonia (FYROM)|Madagascar|Malawi|Malaysia|Maldives|Mali|Malta|Marshall Islands|Martinique|Mauritania|Mauritius|Micronesia|Moldova|Monaco|Mongolia|Montenegro|Montserrat|Morocco|Mozambique|Myanmar (Burma)|Namibia|Nauru|Navassa Island|Nepal|Netherlands|New Zealand|Nicaragua|Niger|Nigeria|North Korea|Norway|Oman|Pakistan|Palau|Palestine|Panama|Papua New Guinea|Paraguay|Peru|Philippines|Poland|Portugal|Puerto Rico|Qatar|Republic of the Congo|Romania|Russia|Rwanda|Saba|Saint Barthelemy|Saint Kitts and Nevis|Saint Lucia|Saint Martin|Saint Pierre and Miquelon|Saint Vincent and the Grenadines|Samoa|San Marino|Sao Tome and Principe|Saudi Arabia|Senegal|Serbia|Seychelles|Sierra Leone|Singapore|Sint Eustatius|Sint Maarten|Slovakia|Slovenia|Solomon Islands|Somalia|South Africa|South Korea|South Sudan|Spain|Sri Lanka|Sudan|Suriname|Swaziland|Sweden|Switzerland|Syria|Taiwan|Tajikistan|Tanzania|Thailand|Timor-Leste|Togo|Tonga|Trinidad and Tobago|Tunisia|Turkey|Turkmenistan|Turks and Caicos Islands|Tuvalu|Uganda|Ukraine|United Arab Emirates|Uruguay|US Virgin Islands|Uzbekistan|Vanuatu|Vatican City|Venezuela|Vietnam|Yemen|Zambia|Zimbabwe" MENU SELECTED, "Country", LIST$, "Please select your country from the list below:" CENTER 15, 10, "You picked : " + GETWORD$(LIST$, SELECTED, 124) ' Prints some text in the middle of the screen. ' We're assuming 80x25 color text mode. SUB CENTER (TEXTCOLOR, ROW, TEXT$) COLOR TEXTCOLOR LOCATE ROW, 40 - FIX(LEN(TEXT$) / 2): PRINT TEXT$; END SUB ' This function returns the Nth word from a list. ' Words must be separated by the separator character S. ' S must hold the ASCII value of the character to be ' used as a separator character. i.e. S=32 means space ' Example: ' GETWORD$("apples peaches kiwi grapes", 1, 32) -> "apples" ' GETWORD$("apples/peaches/kiwi/grapes", 3, 47) -> "kiwi" ' GETWORD$("apples+peaches+kiwi+grapes", 9, 43) -> "" (out of range) ' FUNCTION GETWORD$ (L$, N, S) LL = LEN(L$) IF N < 1 OR N > LL / 2 + 2 THEN GETWORD$ = "": EXIT FUNCTION W = 0 F = 0 FOR I = 1 TO LL + 1 IF I > LL THEN C = S ELSE C = ASC(MID$(L$, I, 1)) IF C = S THEN IF F AND W = N THEN GETWORD$ = MID$(L$, F, I - F) EXIT FUNCTION END IF F = 0 ELSE IF F = 0 THEN F = I: W = W + 1 END IF NEXT I GETWORD$ = "" END FUNCTION ' Displays a menu on the screen, and allows the user to select ' one item from the list. L$ should contain the list of menu items ' separated by the | character. S will hold the number of the ' selected menu item. If S is 5 at the beginning, this means the ' 5th item on the list is selected by default. If the user picks ' a different menu item and presses Enter, then S will change. ' If the user presses ESC, ALT+X or ALT+F4, S will be -1. ' SUB MENU (S, TITLE$, L$, TEXT$) C0 = 0 ' Main window background pick:0-7 C1 = 7 ' Color 2 (FG) pick:0-7 C2 = 0 ' Color 1 (BG) pick:0-7 C3 = 15 ' Typing color pick:0-15 C4 = 12 ' Mistyped item color pick:0-15 C5 = 9 ' Title color (TITLE$) pick:0-15 C6 = 14 ' Description color (TEXT$) pick:0-15 ORIGINAL = S SCREEN 0 WIDTH 80, 25 COLOR C1, C0 CLS ' Display title. CENTER C5, 2, TITLE$ ' Display description text. CENTER C6, 4, TEXT$ REDIM C$(1 TO 250) ' <<< Array size may need to be modified. ' Split list into string array P = 1 LL = 0 ' Longest line FOR I = 1 TO UBOUND(C$) F = P P = INSTR(P, L$, "|") IF P < 1 THEN P = 9999 C$(I) = MID$(L$, F, P - F) IF LL < LEN(C$(I)) THEN LL = LEN(C$(I)) IF P = 9999 THEN EXIT FOR P = P + 1 NEXT I ' S = Selected Item ' LL = Longest line length MM = I ' MM = Number of menu items W$ = "" ' W$ = User typed search text N = 0 ' N = User typed search text found? F = 0 ' F = Vertical Display Offset M = 8 ' M = Number of menu items to display on screen TOP = 5 ' TOP = Top row where menu starts Y ' X = Start printing menu at pos X X = 33 - FIX(LL / 2) DO ' Print menu items FOR I = 1 TO M Y = I * 2 + TOP IF S = I + F THEN COLOR C2, C1 ELSE COLOR C1, C2 END IF T$ = C$(I + F) LOCATE Y, X: PRINT SPACE$(5); T$; SPACE$(LL - LEN(T$) + 10); NEXT I ' Put lines or spaces among menu items FOR I = 1 TO M + 1 IF S = I + F THEN COLOR C1, C2 ELSEIF S = I + F - 1 THEN COLOR C2, C1 ELSE COLOR C2, C2 END IF LOCATE I * 2 + TOP - 1, X: PRINT STRING$(LL + 15, CHR$(220)); NEXT I ' Print search text IF N THEN COLOR C3, C2 ELSE COLOR C4, C2 Z$ = LEFT$(W$, 40) LOCATE 24, 20: PRINT Z$; SPACE$(40 - LEN(Z$)); IF LEN(W$) THEN LOCATE 24, 20 + LEN(Z$), 1, 12, 13 ELSE LOCATE 1, 1, 0 K$ = "": WHILE K$ = "": K$ = INKEY$: WEND LOCATE 1, 1, 0 ' Turn off cursor ' Process search text N = 0 IF LEN(K$) = 1 THEN U = ASC(UCASE$(K$)) IF LEN(W$) AND K$ = CHR$(8) THEN ' BACKSPACE W$ = LEFT$(W$, LEN(W$) - 1) ELSEIF U = 32 OR U > 64 AND U < 91 OR (U > 47 AND U < 58) THEN ' TYPING W$ = W$ + K$ END IF IF LEN(W$) THEN FOR G = 1 TO UBOUND(C$) ' FIND ITEM IF UCASE$(LEFT$(C$(G), LEN(W$))) = UCASE$(W$) THEN N = 1 S = G IF S < F OR S > F + M THEN F = S - FIX(M / 2) IF F < 0 THEN F = 0 IF F > MM - M THEN F = MM - M END IF EXIT FOR END IF NEXT G END IF END IF SELECT CASE K$ CASE CHR$(0) + "G": ' HOME W$ = "" S = 1 F = 0 CASE CHR$(0) + "O": ' END W$ = "" S = MM F = MM - M IF F < 0 THEN F = 0 CASE CHR$(0) + "I": ' PGUP W$ = "" S = S - M F = F - M IF S < 1 THEN S = 1 IF F < 0 THEN F = 0 CASE CHR$(0) + "Q": ' PGDN W$ = "" S = S + M F = F + M IF S > MM THEN S = MM IF F > MM - M THEN F = MM - M IF F < 0 THEN F = 0 CASE CHR$(0) + "H": ' UP ARROW W$ = "" IF S > 1 THEN S = S - 1 IF S <= F THEN F = F - 1 END IF CASE CHR$(0) + "P": ' DOWN ARROW W$ = "" IF S < MM THEN S = S + 1 IF S >= F + I - 1 THEN F = F + 1 END IF CASE CHR$(13): EXIT DO ' ENTER CASE CHR$(0) + "K": EXIT DO ' LEFT ARROW CASE CHR$(0) + "M": EXIT DO ' RIGHT ARROW CASE CHR$(0) + "-": S = -1: EXIT DO ' ALT-X CASE CHR$(0) + "k": S = -1: EXIT DO ' ALT-F4 CASE CHR$(27): S = -1: EXIT DO ' ESC END SELECT LOOP ERASE C$ COLOR 7, 0 CLS END SUB