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ą.

 

Język

Polska wersja językowa    English language version

Poleć stronę

Aby polecić aktualnie oglądaną stronę kliknij:

Licznik wizyt

Liczniki

Kontakt

Wiadomości

03.12.2013

Dodano opis gry Stellar System.

16.06.2013

Dodano opis programu "System Sprzedaży", oraz poprawiono treści na stronie.

10.05.2012

Strona została całkowicie przebudowana. Zmieniono layout, poprawiono teksty, oraz dodano angielską wersję strony.