Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Проблемы с VK_BACK   Найти похожие ветки 

 
BanderLog   (2005-11-30 07:53) [0]

Здравствуйте. Возникла проблема при обработке нажатия клавиш в ComboBox. В OnKeyDown прописываю простой код

If Key in [VK_DELETE, VK_BACK] Then
 Key := 0;

На форме больше ничего нету, обработчик только этот. В итоге нажатия Del игнорируются, а BackSpace как работал так и продолжает работать. В чем проблема? Условие отрабатывается, но действие все равно происходит... :(
Пробовал с Edit, та же ерунда.


 
Юрий Зотов ©   (2005-11-30 08:00) [1]

Ловите символ #8 в OnKeyPress и присваивайте ему значение #0.


 
BanderLog   (2005-11-30 08:04) [2]

Спасибо, помогло, но почему на всех форумах упорно советуют использовать именно OnKeyDown? И почему в приведёном мною варианте не работало, реализация VCL такая?


 
Юрий Зотов ©   (2005-11-30 08:54) [3]

> BanderLog   (30.11.05 08:04) [2]

> реализация VCL такая?

Это не VCL, это Windows (а VCL просто следует концепциям Windows, что совершенно правильно). Если объяснять "на пальцах", то механика здесь примерно такая.

Аппаратно, при своем нажатии и отпускании клавиши посылают так называемый скэн-код, который переводится драйвером клавиатуры либо в однобайтовый, либо в двухбайтовый код. К первым (однобайтовым) относятся клавиши, которые есть в таблице ASCII (в частности, BackSpace), а ко вторым (двухбайтовым) - остальные. И те, и другие транслируютя системой в сообщения WM_KEYDOWN/WM_KEYUP (которые в VCL генерят события OnKeyDown/OnKeyUp), но затем однобайтовые (и только они) транслируются еще и в сообщение WM_CHAR (которое в VCL генерит событие OnKeyPress).

В результате, нажатие однобайтовой клавиши в OnKeyDown успешно ловится (Вы сами видели, что условие срабатывает), но сбросить его в OnKeyDown не получится (что Вы тоже видели сами) - потому что уже после обработки OnKeyDown придет еще и сообщение WM_CHAR, на которое и сработает контрол (что Вы тоже видели).

Чтобы сбросить однобайтовую клавишу, надо сбрасывать именно сообщение WM_CHAR - то есть, сбрасывать однобайтовые клавиши надо только в OnKeyPress. Соответственно, двухбайтовые клавиши можно сбросить только в OnKeyDown, поскольку в OnKeyPress они вообще не поступают.

>  почему на всех форумах упорно советуют использовать именно
> OnKeyDown

Видимо, советуют те, кто не знает всей этой кухни. Увы, на форумах довольно часто встречаются люди, которые дают советы, не будучи достаточно компетентными.


 
BanderLog   (2005-11-30 09:49) [4]

Огромное спасибо!
Теперь все стало понятно, сохраню ка я эту страничку себе для потомков. :)

Получается что двухбайтовые ( такие как F1..F12, Del, Home и т.д.) Я могу отловить и перекрыть, в случае необходимости только в OnKeyDown/OnKeyUp.
Однобайтовые же я могу отловить OnKeyDown/OnKeyPress/OnKeyUp, перекрыть же их получится  только в OnKeyPress.
Теперь все становится на свои места :)
Не подскажете, если не затруднит, где можно посмотреть какие коды к каким относятся, на будущее памятку.


 
Юрий Зотов ©   (2005-11-30 16:07) [5]

> BanderLog   (30.11.05 09:49) [4]
> какие коды к каким относятся

Однобайтовые - это те, которые есть в таблице ASCII, всегда можно по ней посмотреть. На память, это все алфавитно-цифровые клавиши (включая пробел), а также Esc (#27), Tab (#9), BackSpace (#8) и Enter (#13).

Нужно еще учитывать, что некоторые клавиши (например, Tab и Enter) могут восприниматься не всеми окнами (то есть, при нажатии этих клавиш такие окна никаких сообщений вообще не получают - и, соответственно, никакие события VCL тоже не возникают). Это зависит от стиля окна (например, см. ES_WANTRETURN) и от того, что возвращает его оконная функция в ответ на сообщение WM_GETDLGCODE. Подробности см. в MSDN по всем этим ключевым словам; там же в топике Keyboard Input подробно описана вся кухня.



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
14-1132831661
Axis_of_Evil
2005-11-24 14:27
2005.12.18
Oberon-2 compilers


1-1132899472
Тома
2005-11-25 09:17
2005.12.18
Удалить временные файлы


2-1132415297
Aleks
2005-11-19 18:48
2005.12.18
Какой компонент использовать


14-1132695161
Separator
2005-11-23 00:32
2005.12.18
Протокол работы gTalk


11-1114177052
Ал
2005-04-22 17:37
2005.12.18
Утечка памяти KOLOpenSaveDialog