Использование клавиш для управления компонентами
Автор: Robert Wittig
Так, если у меня есть своего рода кнопка (check, radio, speed и т.п.), то почему я не могу с помощью клавиш курсора управлять ею?
После некоторых экспериметов я создал метод, который привожу ниже, способный перехватывать в форме все нажатые клавиши позиционирования и управлять ими выбранным в настоящий момент элементом управления. Имейте в виду, что элементы управления (кроме компонентов Label) должны иметь возможность "выбираться". Для возможности выбрать GroupBox или другой компонент, удедитесь, что их свойство TabStop установлено в True. Вы можете переместить управление на GroupBox, но, так как он не выделяется целиком, узнать, что он действительно имеет управление, достаточно непросто. Если вам не нужно передавать управление в контейнерные элементы (нижеследующий код исходит из этого предположения), то вы можете управлять элементами, просто перемещая управление в сам GroupBox.
В нижеследующем коде FormActivate является обработчиком события формы OnActivate, тогда как ProcessFormMessages никакого отношения к событиям формы не имеет. Не забудьте поместить объявление процедуры ProcessFormMessages в секцию 'Private' класса вашей формы.
Надеюсь, что вам помог.
Code: |
procedure TForm1.FormActivate(Sender: TObject); begin { Делаем ссылку на нового обработчика сообщений } Application.OnMessage := ProcessFormMessages; end;
procedure tForm1.ProcessFormMessages(var Msg: tMsg; var Handled: Boolean); var Increment: Byte; TheControl: tWinControl; begin { проверка наличия системного сообщения KeyDown } case Msg.Message of WM_KEYDOWN: if Msg.wParam in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT] then begin { изменяем величину приращения взависимости от состояния клавиши Shift } if GetKeyState(VK_SHIFT) and $80 = 0 then Increment := 8 else Increment := 1;
{ Этот код перемещает управление на родительский GroupBox, если один из его контейнерных элементов получает фокус. Если вам необходимо управлять элементами внутри контейнера, удалите блок IF и измените в блоке CASE TheControl на ActiveControl }
if (ActiveControl.Parent is tGroupBox) then TheControl := ActiveControl.Parent else TheControl := ActiveControl;
case Msg.wParam of VK_UP: TheControl.Top := TheControl.Top - Increment; VK_DOWN: TheControl.Top := TheControl.Top + Increment; VK_LEFT: TheControl.Left := TheControl.Left - Increment; VK_RIGHT: TheControl.Left := TheControl.Left + Increment; end;
{ сообщаем о том, что сообщение обработано } Handled := True; end; end; end; |
- Назад
- Вперёд >>
Новые статьи
- Как сделать клавишу-акселератор (keyboard shortcut) компонету, у которого нет заголовка
- Как определить нажаты ли клавиши Shift, Alt или Ctrl
- Как выполнять другую команду по нажатию на кнопку, если зажата клавиша Shift
- Какая клавиша нажата при загрузке приложения
- Работа с цифровой клавиатурой при выключенном NumLock
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!