Запрет смены фокуса и обработка событий при нажатии стрелок

Бывает так. Пишешь какой-нибудь красочный визуальный CustomControl, и в какой-то момент хочешь добавить реакцию на клавиатурные кнопки влево-вправо-вверх-вниз. Как грамотный человек, переопределяешь методы KeyDown или KeyPress. И тут приходит жесткий облом…

А бывает так, что творишь нечто на форме, что должно воспринимать эти злосчастные кнопки, но тут же рядом разбросаны всякие button‘ы и checkbox‘ы. Установка свойства KeyPreview формы в true с последующей обработкой OnKeyDown проблемы не решает. События просто нет. Зато фокус скачет с radiobutton на checkbox, тем самым произвольно меняя настройки.

На самом деле событие возникает, просто не всегда. Если фокус, например, на checkbox’е, событие не наступит. Хочется, мало того, чтобы всегда ловить события стрелок, но и запретить смену фокуса.

Давайте не будем трогать событие Application.OnMessage. Это слишком эпично для небольшой задачи.

Делаем так. KeyPreview оставляем true. Событие OnKeyDown формы, выглядит, например, так:

То есть это то, что сделали изначально, но не получили видимого результата.

Сообщаем форме ловить событие CM_DIALOGKEY.

И метод-обработчик:

Событие CM_DIALOGKEY обслуживает нажатия кнопок VK_TAB, VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_RETURN, VK_EXECUTE, VK_ESCAPE, VK_CANCEL.

В CmDialogKey вызываем метод-обработчик FormKeyDown, который вернет Key равный нулю, если нажаты стрелки. Если нажаты не стрелки, обработка пойдет дальше. Если нажаты — фокус никуда скакать не будет. Таким образом сделали запрет смены фокуса и корректную обработку событий стрелочных кнопок для формы.

Запрет смены фокуса и перехват стрелочных кнопок для наследника TWinControl осуществляется другими событиями.

И реализация:

То есть мы все равно переопределяем KeyDown и KeyUp. Потому что это логично. Но вот вызываем эти методы в случае нажатых стрелок из CNKeyDown и CNKeyUp. Потому что виртуальные методы KeyDown и KeyUp стандартно просто не вызываются в этом случае.


Друзья, спасибо за внимание!

Подписывайтесь на телегу. Все коротыши там.

Там же можно комментировать, обсуждать и ругаться.

Поискать упоминание этой темы на сайте.

5 5 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Bor

Роман! Почините последнюю ссылку про упоминание — куда-то не туда смотрит.

2
0
Не нашли ответ на свой вопрос? Задайте его здесь!...x