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