Как на 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д