Программа не реагирует на 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»
textual
Листинг программы
ch := readkey; if ch = #0 then ch := readkey; case readkey of #13:
Объяснение кода листинга программы
- Сначала программа ожидает нажатия клавиши.
- Если нажата клавиша Enter (которая имеет ASCII-код 13), то выполняется блок кода, который начинается с case 13.
- В этом блоке кода программа не делает ничего, так как его единственная цель - просто обработать нажатие клавиши Enter.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д