![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с кнопкой VK_DECIMAL на цифровой клавиатуре
Bless © (2004-12-24 13:44:00)Люди, работающие с программой, вводят разные числа в основном с использованием цифровой клавиатуры (справа от основной).
И разделитель дробной и целой частей - под кнопкой VK_DECIMAL (Del на цифровой клавиатуре при выключенном NumLock).
Но при русской раскладке они не могут ввести разделитель дробной части (".") с помощью этой кнопки, потому что ей тогда соответствует символ "," а не "." и им приходится постоянно нажимать "." на основной клавиатуре. Короче, жалуются, что очень неудобно.
Как лучше всего сделать, чтобы при любой раскладке для всех компонентов в проекте, для которых это важно (собственно, это только DBAware-компоненты), кнопка VK_DECIMAL оставалась разделителем целой и дробной частей?
Обрабатывать ONKeyDown для каждого компонента - это ж задолбаться можно. Компонентов тьма. И унаследовать их от общего предка, который эту ситуацию разрулит, тоже поздно, придется все переписывать.
Пока что мне пришло на ум только в обработчике Application.OnMessage перехватывать WM_KEYDOWN при wParam=VK_DECIMAL и вместо него генерировать WM_CHAR с нужным кодом клавиши-разделителя.
Чем это плохо, какие грабли могут ждать и может можно как-то лучше.
Пока что меня смущает то, что Application.OnMessage вызывается слишком часто и на кажном сообщении это - расходы на вызов моего обработчика. Это ж замедлит работу приложения неслабо, наверное.
В общем хотелось бы обсудить варианты решения этого вопроса.
Anatoly Podgoretsky (2004-12-28 13:36:00) [1]Ты путаешь, точка в русском языке не является десятичным разделителем, а вот запятая именно оно и есть.
Bless (2004-12-28 10:49:00) [2]olookin[1]>
Ну, визуально и у меня вроде не тормозит. Но как представлю себе СОТНИ сообщений и на каждом самом захудалом и ненужном: поместить в стек адрес возврата, поместить в стек адрес регистр флагов, да еще и параметры, да еще и self передать, а потом все в обратном порядке... и все это только ради того, чтоб обработать ОДИН не самый частый случай, то аж жаба давит.
Ну, поскольку вариантов больше нет, то так наверное и останется.
Хотя еще не нравится, что после моего вмешательства приложению приходит WM_CHAR, до которого не приходило соответствующего ему WM_KEYDOWN. Не представляю, правда, на что это может влиять, но мало ли.
И еще одно: всегда ли сообщения WM_KEYDOWN передаются в очередь сообщений или бывает так, что и напрямую вызывается процедура окна? То есть, в варианте с OnMessage гарантированно ли я перехватываю ВСЕ сообщения WM_KEYDOWN?
olookin (2004-12-24 20:40:00) [3]У меня такой же обработчик, и ничего не тормозит (по крайней мере незаметно). И если в этом обработчике (как и у меня) поставить условие на нужное сообщение, то эффект достигается (опять-таки у меня)... В общем, я не вижу проблем при использовании OnMessage.