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

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

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

> ASCII null code
deity
сообщение 31.05.2010 14:09
Сообщение #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 килобайт ) Кол-во скачиваний: 531
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 6)
TarasBer
сообщение 31.05.2010 14:16
Сообщение #2


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

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

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


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


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





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

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


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


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

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

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


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

Да.

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

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.05.2010 15:01
Сообщение #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
сообщение 31.05.2010 15:19
Сообщение #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 
 К началу страницы 
+ Ответить 
deity
сообщение 1.06.2010 0:26
Сообщение #7





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

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


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

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

 

- Текстовая версия 28.07.2025 17:24
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"