Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
ВнизПроблемы с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c