Kurs QBasic - Dodatek A
Jak utworzyć menu wyboru ?
Ponieważ nie mam już zbyt wiele nowych poleceń do opisania, postanowiłem dodać do tego kursu troszkę więcej rzeczy praktycznych i tym samym (mam nadzieje) bardziej przydatnych. W tym dodatku zajmiemy się tworzeniem menu wyboru. Z góry mówię, iż nie chodzi mi o wygląd menu (to jest sobie w stanie każdy samodzielnie zaprojektować). Mam raczej na myśli technikę wykonywania menu do twoich własnych programów. Na początek kod źródłowy jednego z moich przykładów:
10 REM PrgA1 - Menu wyboru TYP-1 20 CLS 30 PRINT " Witaj w programie Menu Wyboru TYP-1" 40 PRINT : PRINT " 1. Wykonaj polecenie nr.1" 50 PRINT " 2. Wykonaj polecenie nr.2" 60 PRINT " 3. Wykonaj polecenie nr.3" 70 PRINT " 4. Wykonaj polecenie nr.4" 80 PRINT " 5. Wykonaj polecenie nr.5" 90 PRINT " k. Wyjdz z programu" 100 LOCATE 10, 1: COLOR 14: LINE INPUT " Wybierz opcje i potwierdz ja enterem ";opcja$ 110 COLOR 7 120 IF opcja$ = "1" THEN 200 130 IF opcja$ = "2" THEN 300 140 IF opcja$ = "3" THEN 400 150 IF opcja$ = "4" THEN 500 160 IF opcja$ = "5" THEN 600 170 IF LCASE$(opcja$) = "k" THEN END 180 LOCATE 10, 39: PRINT SPACE$(42) 190 GOTO 100 200 PRINT : PRINT " Wybrales polecenie nr.1" 210 END 300 PRINT : PRINT " Wybrales polecenie nr.2" 310 END 400 PRINT : PRINT " Wybrales polecenie nr.3" 410 END 500 PRINT : PRINT " Wybrales polecenie nr.4" 510 END 600 PRINT : PRINT " Wybrales polecenie nr.5" 610 END
Jak widać, kod źródłowy jest znacznie większy od wcześniejszych kodów. Nie znaczy to jednak, że jest trudniejszy bowiem wszystkie polecenia już poznałeś (jeżeli tylko przeczytałeś wcześniejsze części tego kursu). Warto jednak pokrótce opisać powyższy przykład. W linii 20 czyścimy ekran, w liniach 30 - 90 wyświetlamy tekst naszego menu. W tym miejscu powinieneś wpisać własne opcje menu. W linii 100 umieszczamy kursor w pozycji (10,1), zmieniamy kolor tekstu na żółty i wyświetlamy tekst z zapytaniem o wybór odpowiedzi. W tym miejscu zatrzymam się na chwilę. Część osób zapewne się dziwi, że użyłem polecenia LINE INPUT, a nie INPUT. Jak już wcześniej wspomniałem LINE INPUT nie ma takich ograniczeń co INPUT (w tym drugim nie można wpisywać przecinków). W linii 110 ponownie zmieniamy kolor na szary (robię to teraz, aby nie zmieniać kolorów za każdym razem w linijkach 200-600). W liniach 120-170 sprawdzam czy została wybrała jedna z dostępnych opcji. Jeżeli tak, następuje skok do miejsca gdzie mają zostać wykonane kolejne polecenia programu. Jeżeli nie została wybrana żadna z możliwych opcji, program przechodzi do linii 180 w której następuje usunięcie tego, co wpisał użytkownik. Do tego celu bardzo przydatne okazuje się polecenie LOCATE, które ustawia kursor za napisem "Wybierz opcje i potwierdz ja enterem" (dzięki temu nie uświadczymy migotania napisow), oraz SPACE$ (które ustawia odpowiednią ilość spacji). W liniach 200-600 znajduje się miejsce na wykonywanie poleceń związanych z wybraną opcją. Zanim przejdę do następnego przykładu, pragnę zwrócić uwagę na linię 170 w której zastosowałem polecenie LCASE$(opcja$). Dzięki temu zabiegowi nie muszę się martwić czy użytkownik wpisał duże "K", czy małe "k". Komputer oba wybory traktuje równoznacznie. Skoro wszystko zostało wyjaśnione, możemy przejść do kolejnego (minimalnie zmienionego) przykładu:
10 REM PrgA2 - Menu wyboru TYP-2 20 CLS 30 PRINT " Witaj w programie Menu Wyboru TYP-2" 40 PRINT : PRINT " 1. Wykonaj polecenie nr.1" 50 PRINT " 2. Wykonaj polecenie nr.2" 60 PRINT " 3. Wykonaj polecenie nr.3" 70 PRINT " 4. Wykonaj polecenie nr.4" 80 PRINT " 5. Wykonaj polecenie nr.5" 90 PRINT " k. Wyjdz z programu" 100 COLOR 14: LOCATE 10, 1: PRINT " Wybierz opcje " 110 COLOR 7 115 opcja$ = INKEY$ 120 IF opcja$ = "1" THEN 200 130 IF opcja$ = "2" THEN 300 140 IF opcja$ = "3" THEN 400 150 IF opcja$ = "4" THEN 500 160 IF opcja$ = "5" THEN 600 170 IF opcja$ = "k" THEN END 190 GOTO 115 200 PRINT : PRINT " Wybrales polecenie nr.1" 210 END 300 PRINT : PRINT " Wybrales polecenie nr.2" 310 END 400 PRINT : PRINT " Wybrales polecenie nr.3" 410 END 500 PRINT : PRINT " Wybrales polecenie nr.4" 510 END 600 PRINT : PRINT " Wybrales polecenie nr.5" 610 END
W porównaniu do przykładu PrgA1, w PrgA2 zmodyfikowano linie 100 (zamiast LINE INPUT mamy PRINT) i 190 (GOTO 100 zostało zamienione przez GOTO 115), usunięto linię 180 (była zbędna), oraz dodano linię 115. Cały sekret nowego menu tkwi właśnie w linii 115, w której pojawiło się nowe, wcześniej nie omawiane polecenie zmienna = INKEY$. To nic innego, jak przypisanie zmiennej do klawiatury i oczekiwanie na wciśnięcie klawisza. Gdy klawisz zostanie wciśnięty, kod wciśniętego znaku zostaje zapisany do zmiennej i sprawdzony w instrukcjach warunkowych. Małym nakładem sił pozbyliśmy się przycisku enter, który trzeba było wciskać po każdym wyborze opcji. Ostatni przykład menu jaki mam do zaprezentowania przedstawiam poniżej:
10 REM PrgA3 - Menu wyboru TYP-3 20 CLS 25 opcja = 1 30 PRINT " Witaj w programie Menu Wyboru TYP-3" 40 PRINT : PRINT " Wykonaj polecenie nr.1" 50 PRINT " Wykonaj polecenie nr.2" 60 PRINT " Wykonaj polecenie nr.3" 70 PRINT " Wykonaj polecenie nr.4" 80 PRINT " Wykonaj polecenie nr.5" 90 PRINT " Wyjdz z programu" 95 COLOR 14 100 GOSUB 1000 115 opcja$ = INKEY$ 120 IF opcja$ = CHR$(0) + CHR$(72) THEN 160 130 IF opcja$ = CHR$(0) + CHR$(80) THEN 180 140 IF opcja$ = " " THEN 195 150 GOTO 115 160 IF opcja = 1 THEN 115 170 COLOR 0: GOSUB 1000: opcja = opcja - 1: GOTO 95 180 IF opcja = 6 THEN 115 190 COLOR 0: GOSUB 1000: opcja = opcja + 1: GOTO 95 193 IF opcja = 1 THEN 200 194 IF opcja = 2 THEN 300 195 IF opcja = 3 THEN 400 196 IF opcja = 4 THEN 500 197 IF opcja = 5 THEN 600 198 IF opcja = 6 THEN END 200 LOCATE 10, 1: PRINT " Wybrales polecenie nr.1" 210 END 300 LOCATE 10, 1: PRINT " Wybrales polecenie nr.2" 310 END 400 LOCATE 12, 1: PRINT " Wybrales polecenie nr.3" 410 END 500 LOCATE 12, 1: PRINT " Wybrales polecenie nr.4" 510 END 600 LOCATE 12, 1: PRINT " Wybrales polecenie nr.5" 610 END 1000 IF opcja = 1 THEN LOCATE 3, 2: PRINT "*" 1010 IF opcja = 2 THEN LOCATE 4, 2: PRINT "*" 1020 IF opcja = 3 THEN LOCATE 5, 2: PRINT "*" 1030 IF opcja = 4 THEN LOCATE 6, 2: PRINT "*" 1040 IF opcja = 5 THEN LOCATE 7, 2: PRINT "*" 1050 IF opcja = 6 THEN LOCATE 8, 2: PRINT "*" 1060 RETURN
W powyższym przykładzie do poruszania się po menu wybrałem kursory klawiatury. W linii 25 zdefiniowałem nową zmienną i przypisałem jej wartość jeden. W linii 100 następuje skok do linii 1000 (GOSUB 1000). W liniach 1000 - 1050 program sprawdza jaką wartość ma zmienna "opcja" i odpowiednio ustawia gwiazdkę (która służy jako element wyboru). W linii 1060 następuje powrót do linii w której znajdował się GOSUB 1000. W linii 115 program oczekuje na wciśnięcie klawisza. W linii 120 za pomocą CHR$(0) + CHR$(72) sprawdzam czy została naciśnięta strzałka w górę, natomiast w linii 130 (CHR$(0) + CHR$(80)) strzałka w dół. Przy okazji warto podać kody dla pozostałych strzałek: CHR$(0) + CHR$(75) dla strzałki w lewo i CHR$(0) + CHR$(77) dla strzałki w prawo - może kiedyś się przydadzą. W linii 140 oczekuje klawisza spacji, który potwierdza wybór danej opcji. Linie 160 - 170 są odpowiedzialne za ruch gwiazdki w górę menu. Za pomocą instrukcji warunkowej blokuje możliwość wyboru opcji menu mniejszej niż 1. Jeżeli gwiazdka ruszyła się w górę, ustawiam kolor na czarny, skaczę do linii 1000 aby usunąć starą gwiazdę, odejmuję jeden od opcji menu i skaczę do linii 95 gdzie kolor zmienia się na żółty i ponownie wyświetla gwiazdkę, tym razem na nowym miejscu. W liniach 180 - 190 ma miejsce identyczna sytuacja, tyle że dla strzałki w dół. W liniach 193-198 sprawdzam która opcja została wybrana i wykonuję odpowiedni skok do dalszych poleceń związanych z daną opcją. Wydaje mi się, że w miarę dokładnie wytłumaczyłem działanie wszystkich trzech przykładów. Mam nadzieję, że się wam przydadzą.