Главная страница
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.038 c
2-1133112498
elysee
2005-11-27 20:28
2005.12.18
rar для текстовиков


14-1132627955
Рсдрп
2005-11-22 05:52
2005.12.18
Как проще откомпилировать программу на Си++?


1-1132470667
Илья Бобров
2005-11-20 10:11
2005.12.18
Исчезают модальные формы


4-1129721314
Ден
2005-10-19 15:28
2005.12.18
WinApi Memory


2-1133504778
Новичек
2005-12-02 09:26
2005.12.18
Что означает данный параметр?