1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Исходник программы вывода меню - Всё понятно за исключением этого:
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) =)
Некоторые клавиши посылают в клавиатурный буфер сразу два символа, причём тогда первый из них - нулевой (а если не нулевой, то значит, это одиночный символ). Просто тип char может принимать только 256 значений, и почти все забиты алфавитом и псевдографикой, для некоторых кнопок символа не хватило. Поэтому пришлось делать по два символа.
мм.. т.е "вверх" и "вниз" посылают 2символа в буффер , а ентер и esc 1, при нажатии на них.. P.S: и как же повторное ожидание (до и после проверки) ch:=ReadKey при нажатии на стрелки (хотя мы нажимаем 1 раз а не два ?)
> мм.. т.е "вверх" и "вниз" посылают 2символа в буффер , а ентер и esc 1, при нажатии на них..
Да.
> PS: и как же повторное ожидание (до и после проверки) ch:=ReadKey при нажатии на стрелки (хотя мы нажимаем 1 раз а не два ?)
Нет повторного ожидания. Просто ReadKey берёт верхний символ из буфера (если он не пуст). Если буфер пуст - вот тогда ожидание. Стрелочки посылают по два символа в буфер, поэтому ожидать ничего не надо, надо два раза взять символ из буфера.