Программа не реагирует на 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.