Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.013 c
2-1133250535
dolmat
2005-11-29 10:48
2005.12.18
Создание и использование DLL


14-1132753711
Карелин Артем
2005-11-23 16:48
2005.12.18
Подскажите софт для форматирования SQL-запросов.


3-1130748382
Sanich
2005-10-31 11:46
2005.12.18
Проблема спередачей параметров в функцию.


2-1133718967
Developerr
2005-12-04 20:56
2005.12.18
Форму в нижний правый угол


14-1132775185
тихий вовочка
2005-11-23 22:46
2005.12.18
Статьи и книги по программированию





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский