Главная страница
    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.46 MB
Время: 0.015 c
3-1130932336
Mouse_Rat
2005-11-02 14:52
2005.12.18
Импорт данных из файла в FireBird


14-1132490094
AlexShm
2005-11-20 15:34
2005.12.18
7-я или 8-я?


14-1132777064
NightLord
2005-11-23 23:17
2005.12.18
Связь ПО с ПК


14-1132694308
Богдан1024
2005-11-23 00:18
2005.12.18
Файлы *.HXI


3-1130750025
GhostT
2005-10-31 12:13
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский