Помощь - Поиск - Пользователи - Календарь
Полная версия: ASCII null code
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
deity
Исходник программы вывода меню -
Всё понятно за исключением этого:

begin
fk:=False;
ch:=ReadKey;
if ch = #0 then begin
fk:=True;
ch:=ReadKey;
end;
if fk then begin
Case ord(ch) of
72:key := Up;
80:key := Down;
end;
end;
if not fk then begin
Case ord(ch) of
13:key := ReturnKey;
27:key := Escape;
end;
end;


а имменно ожидание нажатия клавиши, проверка с каким-то нулевым символом ( #0 ) и снова ожидание нажатия клавиши.. хотя в работе в работе программы нажатие клавиши ожидаеться только 1раз а не 2.
и что за символл этот такой #0 (NULL) =)
TarasBer
Некоторые клавиши посылают в клавиатурный буфер сразу два символа, причём тогда первый из них - нулевой (а если не нулевой, то значит, это одиночный символ).
Просто тип char может принимать только 256 значений, и почти все забиты алфавитом и псевдографикой, для некоторых кнопок символа не хватило. Поэтому пришлось делать по два символа.
deity
мм.. т.е "вверх" и "вниз" посылают 2символа в буффер , а ентер и esc 1, при нажатии на них..
P.S: и как же повторное ожидание (до и после проверки) ch:=ReadKey при нажатии на стрелки (хотя мы нажимаем 1 раз а не два ?)
TarasBer
> мм.. т.е "вверх" и "вниз" посылают 2символа в буффер , а ентер и esc 1, при нажатии на них..

Да.

> PS: и как же повторное ожидание (до и после проверки) ch:=ReadKey при нажатии на стрелки (хотя мы нажимаем 1 раз а не два ?)

Нет повторного ожидания. Просто ReadKey берёт верхний символ из буфера (если он не пуст). Если буфер пуст - вот тогда ожидание. Стрелочки посылают по два символа в буфер, поэтому ожидать ничего не надо, надо два раза взять символ из буфера.
volvo
Это кривой
Цитата
Исходник программы вывода меню -


Потому что читать невозможно. Сравни:

   ch := ReadKey;
Case ch Of
#0: { Расширенная клавиша? }
begin
ch := ReadKey;
Case ch Of
#72: key := Up;
#80: key := Down;
end;
end; { Закончили с расширенными клавишами }

#13: key := ReturnKey;
#27: key := Escape;
end; { Case }
TarasBer
А зачем всё в одну переменную пихать?

const
kBackSpace = #8;
kTab = #9;
kEnter = #13;
kEsc = #27;

skF1 = #59;
skF2 = #60;
skF3 = #61;
skF4 = #62;
skF5 = #63;
skF6 = #64;
skF7 = #65;
skF8 = #66;
skF9 = #67;
skF10 = #68;
skCtrlF1 = #94;
skCtrlF2 = #95;
skCtrlF3 = #96;
skCtrlF4 = #97;
skCtrlF5 = #98;
skCtrlF6 = #99;
skCtrlF7 = #100;
skCtrlF8 = #101;
skCtrlF9 = #102;
skCtrlF10 = #103;
skAltF1 = #104;
skAltF2 = #105;
skAltF3 = #106;
skAltF4 = #107;
skAltF5 = #108;
skAltF6 = #109;
skAltF7 = #110;
skAltF8 = #111;
skAltF9 = #112;
skAltF10 = #113;
skHome = #71;
skUp = #72;
skPageUp = #73;
skLeft = #75;
skRight = #77;
skEnd = #79;
skDown = #80;
skPageDown = #81;
skInsert = #82;
skDel = #83;
skCtrlLeft = #115;
skCtrlRight = #116;
skCtrlPageDown = #118;
skCtrlPageUp = #132;

skAltChar: array ['A' .. 'Z'] of char =
(#30, #48, #46, #32, #18, #33, #34, #35, #23, #36, #37, #38, #50,
#49, #24, #25, #16, #19, #31, #20, #22, #47, #17, #45, #21, #44);
skAltNumber: array ['0' .. '9'] of char =
(#129, #120, #121, #122, #123, #124, #125, #126, #127, #128);

...

Key := ReadKey;
if Key = #0 then ScanKey := ReadKey else ScanKey := #0;

deity
спасибо)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.