Как на 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'ов не надо
     '  интерпретатор и так поймёт что это конец программы.

Объяснение кода листинга программы

  1. Переменная Vib% инициализируется значением 0 и используется для отслеживания текущего выбранного пункта меню.
  2. Переменная Drw% инициализируется значением 1 и используется для управления отрисовкой меню.
  3. Код в бесконечном цикле выполняется до тех пор, пока не будет нажата клавиша ESCAPE.
  4. В каждой итерации цикла проверяется, была ли нажата клавиша вверх (код H). Если это так, то значение переменной Vib% уменьшается на 1, если оно больше 0, и флаг Drw% устанавливается в 1 для перерисовки меню.
  5. Затем проверяется, была ли нажата клавиша вниз (код P). Если это так, то значение переменной Vib% увеличивается на 1, если оно меньше 2, и флаг Drw% устанавливается в 1 для перерисовки меню.
  6. Если нажата клавиша ENTER (код 13), то выполняется код для выбора пункта меню.
  7. В этом коде используется оператор CASE для определения, какой пункт меню был выбран, и соответствующий код выполняется для каждого пункта.
  8. После выбора пункта меню или нажатия клавиши ENTER, экран очищается командой CLS.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы