Как на Qbasic сделать вертикальное меню
Формулировка задачи:
Нужно вывести на экран в столбец пункты меню, примерно так:
Пункт 1
Пункт 2
...
Пункт 10
Пункт 1 выделить другим цветом. И ждать нажатия клавиш стрелок вверх и вниз.
При нажатии стрелки вниз Пункт i закрашивается фоновым цветом, а Пункт i+1 выделяется
Если сейчас выделен первый пункт, то выделяется последний.
При нажатии стрелки вверх Пункт i закрашивается фоновым цветом, а Пункт i-1 выделяется
Если сейчас выделен последний пункт, то выделяется первый.
И все это в текстовом режиме SCREEN 0 !
Как всё это сделать? Только не надо общих слов, дайте конкретные команды, хотя бы основные.
Решение задачи: «Как на Qbasic сделать вертикальное меню»
textual
Листинг программы
- Vib% = 0 ' Текущий выбор
- Drw% = 1 ' Нарисуем меню в самом начале
- DO ' Это бесконечный цикл с постусловием
- Kb$ = INKEY$ ' Это получение кодов нажатых клавиш
- ' т.е. если клавиша была нажата, её
- ' код в строковом выражении запишется
- ' в строковую переменную Kb$, а если
- ' не было нажатий клавиш, то соотв.
- ' переменная будет пустым значением.
- ' Это мы проверяем нажата ли клавиша вверх(смотрим Kb$)
- ' и отнимаем единицу от значения выбранного пункта, если
- ' его значение больше нуля, т.е. не даём выйти за ноль.
- ' После изменения значения, ставим флаг отрисовки меню
- IF Kb$ = CHR$(0) + "H" AND Vib% > 0 THEN Vib% = Vib% - 1: Drw% = 1
- ' Это мы проверяем нажата ли клавиша вниз
- ' и прибавляем единицу к значению выбранного пункта, если
- ' его значение меньше двух, т.е. мы ограничиваем кол-во
- ' пунктов тремя значениями: 0, 1, 2
- ' Также после изменения значения, ставим флаг отрисовки меню
- IF Kb$ = CHR$(0) + "P" AND Vib% < 2 THEN Vib% = Vib% + 1: Drw% = 1
- ' Тут будет выбор пункта меню ENTER'ом
- IF Kb$ = CHR$(13) THEN
- ' Пусть надпись выводится вверху, жёлтым цветом
- LOCATE 1, 1: COLOR 14
- ' Селект кейзу скармливаем переменную,
- ' по значению которой нужно произвести выбор
- ' Далее пишем CASE, номер пункта и код для выполнения
- ' Двоеточие равносильно переводу на другую строку, т.е.
- ' если бы мы писали код на следующей строке.
- SELECT CASE Vib%
- CASE 0: PRINT "Punkt 1"
- CASE 1: PRINT "Punkt 2"
- CASE 2: PRINT "Punkt 3"
- CASE ELSE ' Этой строчки требуют некоторые компиляторы
- ' по сути это исключающее условие, т.е. если
- ' ни один пункт не выбран, то выполнится код
- ' между CASE ELSE и END SELECT(однако этого
- ' никогда не произойдёт).
- END SELECT
- END IF
- ' Это условие отрисовки меню
- ' после изменения выбранного пункта
- ' оно единоразово выполняется
- IF Drw% = 1 THEN
- ' Сбросим флаг отрисовки, чтобы не
- ' выполнять мног раз. Нам нужно
- ' перерисовывать меню только тогда,
- Drw% = 0 ' когда выбранный пункт изменился.
- ' Тут ставим позицию печати в заданную точку(LOCATE)
- ' и проверяем ровняется ли значение выбранного пункта
- ' значению пункта который в тек. момент отрисовываем.
- ' Если ровняется, значит это и есть выбранный пункт,
- ' помечаем его особым цветом(11), в противном случае ставим
- ' ему обычный цвет(8).
- ' Цвет задаётся оператором COLOR
- ' Пункт 1
- LOCATE 5, 10: IF Vib% = 0 THEN COLOR 11 ELSE COLOR 8
- ' Печатаем наш пункт
- PRINT "Punkt 1"
- ' Пункт 2
- LOCATE 6, 10: IF Vib% = 1 THEN COLOR 11 ELSE COLOR 8
- ' Печатаем наш пункт
- PRINT "Punkt 2"
- ' Пункт 3
- LOCATE 7, 10: IF Vib% = 2 THEN COLOR 11 ELSE COLOR 8
- ' Печатаем наш пункт
- PRINT "Punkt 3"
- END IF ' Конец отрисовки меню
- ' Тут код цикла заканчивается
- ' Заодно поставим постусловие на выход из цикла
- ' по нажатию клавиши ESCAPE
- LOOP UNTIL Kb$ = CHR$(27)
- CLS ' Очистим экран, дальше никаких END'ов не надо
- ' интерпретатор и так поймёт что это конец программы.
Объяснение кода листинга программы
- Переменная
Vib%
инициализируется значением 0 и используется для отслеживания текущего выбранного пункта меню. - Переменная
Drw%
инициализируется значением 1 и используется для управления отрисовкой меню. - Код в бесконечном цикле выполняется до тех пор, пока не будет нажата клавиша ESCAPE.
- В каждой итерации цикла проверяется, была ли нажата клавиша
вверх
(кодH
). Если это так, то значение переменнойVib%
уменьшается на 1, если оно больше 0, и флагDrw%
устанавливается в 1 для перерисовки меню. - Затем проверяется, была ли нажата клавиша
вниз
(кодP
). Если это так, то значение переменнойVib%
увеличивается на 1, если оно меньше 2, и флагDrw%
устанавливается в 1 для перерисовки меню. - Если нажата клавиша ENTER (код 13), то выполняется код для выбора пункта меню.
- В этом коде используется оператор CASE для определения, какой пункт меню был выбран, и соответствующий код выполняется для каждого пункта.
- После выбора пункта меню или нажатия клавиши ENTER, экран очищается командой CLS.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д