Использование клавиш для управления компонентами
|
Все, что написано на клаве
Ведет к погибели иль славе...
|
Так, если у меня есть своего рода кнопка (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;
|
|