Содержание материала

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

Автор: 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;

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить