Программа не реагирует на Enter - Free Pascal

Узнай цену своей работы

Формулировка задачи:

unit nice_menu;
 
INTERFACE
 
type
  TMenuItem = record
    name: string;
    submenu: array of string;
  end;
  TMenu = array of TMenuItem;
 
  procedure ShowMenu(var menu: TMenu; var item, subitem: integer);
  procedure ReadMenu(var menu: TMenu; var f: text);
  procedure AlignMenu(var menu: TMenu);
 
IMPLEMENTATION
uses crt;
//----------------------------------------------------------------
procedure ShowMenu(var menu: TMenu; var item, subitem: integer);
var
  i, j, x: integer;
  ch: char;
begin
  item := 0;
  subitem := -1;
 
  repeat
    textbackground(black);
    clrscr;
    textbackground(blue);
    textcolor(white);
    for i := 0 to high(menu) do
      if i = item then
      begin
        textbackground(white);
        textcolor(blue);
        x := whereX;
        write(menu[i].name, '  ');
        textbackground(blue);
        textcolor(white);
 
        if subitem >= 0 then
          for j := 0 to high(menu[i].submenu) do
          begin
            gotoxy(x, 2+j);
            if j = subitem then
            begin
              textbackground(white);
              textcolor(blue);
              write(menu[i].submenu[j]);
              textbackground(blue);
              textcolor(white);
            end
            else
              write(menu[i].submenu[j]);
          end;
      end
      else
        write(menu[i].name, '  ');
 
    ch := readkey;
    if ch <> #0 then
      continue;
    case readkey of
    #13:
      if subitem >= 0 then
        exit
      else
        subitem := 0;
    #77:
      begin
        item := (item + 1) mod length(menu);
        if subitem >= 0 then
          subitem := 0;
      end;
    #75:
      begin
        item := (length(menu) + item - 1) mod length(menu);
        if subitem >= 0 then
          subitem := 0;
      end;
    #80:
      if subitem >= 0 then
        subitem := (subitem + 1) mod length(menu[item].submenu);
    #72:
      if subitem >= 0 then
        subitem := (length(menu[item].submenu) + subitem - 1) mod length(menu[item].submenu);
    #27:
      subitem := -1;
    end;
  until false;
end;
//----------------------------------------------------------------
procedure ReadMenu(var menu: TMenu; var f: text);
var
  i, j, menulen, sublen: integer;
begin
  readln(f, menulen);
  setlength(menu, menulen);
  for i := 0 to high(menu) do
    with menu[i] do
    begin
      readln(f, name);
      readln(f, sublen);
      setlength(submenu, sublen);
      for j := 0 to high(submenu) do
        readln(f, submenu[j]);
    end;
end;
//----------------------------------------------------------------
procedure AlignMenu(var menu: TMenu);
var
  i, j, maxlen: integer;
begin
  for i := 0 to high(menu) do
    with menu[i] do
    begin
      maxlen := 0;
      for j := 0 to high(submenu) do
        if length(submenu[j]) > maxlen then
          maxlen := length(submenu[j]);
      for j := 0 to high(submenu) do
      begin
        while length(submenu[j]) < maxlen do
          submenu[j] := submenu[j] + ' ';
        submenu[j] := ' ' + submenu[j] + ' ';
      end;
    end;
end;
//----------------------------------------------------------------
 
begin end.
Кроме Enter-а на все реакция идет (см. со строки 65). А при нажатии на Enter ничего не происходит как будто на что-то другое нажали. В чем ошибка?

Решение задачи: «Программа не реагирует на Enter»

textual
Листинг программы
ch := readkey;
    if ch = #0 then ch := readkey;
    case readkey of
    #13:

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

  1. Сначала программа ожидает нажатия клавиши.
  2. Если нажата клавиша Enter (которая имеет ASCII-код 13), то выполняется блок кода, который начинается с case 13.
  3. В этом блоке кода программа не делает ничего, так как его единственная цель - просто обработать нажатие клавиши Enter.

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


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

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

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