Использование клавиш для управления компонентами

Советы » Клавиши » Использование клавиш для управления компонентами

Так, если у меня есть своего рода кнопка (check, radio, speed и т.п.), то почему я не могу с помощью клавиш курсора управлять ею?

После некоторых экспериметов я создал метод, который привожу ниже, способный перехватывать в форме все нажатые клавиши позиционирования и управлять ими выбранным в настоящий момент элементом управления. Имейте в виду, что элементы управления (кроме компонентов Label) должны иметь возможность "выбираться". Для возможности выбрать GroupBox или другой компонент, удедитесь, что их свойство TabStop установлено в True. Вы можете переместить управление на GroupBox, но, так как он не выделяется целиком, узнать, что он действительно имеет управление, достаточно непросто. Если вам не нужно передавать управление в контейнерные элементы (нижеследующий код исходит из этого предположения), то вы можете управлять элементами, просто перемещая управление в сам GroupBox.

В нижеследующем коде FormActivate является обработчиком события формы OnActivate, тогда как ProcessFormMessages никакого отношения к событиям формы не имеет. Не забудьте поместить объявление процедуры ProcessFormMessages в секцию 'Private' класса вашей формы.

Надеюсь, что вам помог.

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

;

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com