IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> ASCII null code
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


Исходник программы вывода меню -
Всё понятно за исключением этого:

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) =)


Прикрепленные файлы
Прикрепленный файл  two.PAS ( 2.11 килобайт ) Кол-во скачиваний: 281
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Некоторые клавиши посылают в клавиатурный буфер сразу два символа, причём тогда первый из них - нулевой (а если не нулевой, то значит, это одиночный символ).
Просто тип char может принимать только 256 значений, и почти все забиты алфавитом и псевдографикой, для некоторых кнопок символа не хватило. Поэтому пришлось делать по два символа.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


мм.. т.е "вверх" и "вниз" посылают 2символа в буффер , а ентер и esc 1, при нажатии на них..
P.S: и как же повторное ожидание (до и после проверки) ch:=ReadKey при нажатии на стрелки (хотя мы нажимаем 1 раз а не два ?)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> мм.. т.е "вверх" и "вниз" посылают 2символа в буффер , а ентер и esc 1, при нажатии на них..

Да.

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

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 }
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


А зачем всё в одну переменную пихать?

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;



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


спасибо)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 13.05.2024 2:40
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name