После некоторых экспериметов я создал метод, который привожу ниже, способный перехватывать в форме все нажатые клавиши позиционирования и управлять ими выбранным в настоящий момент элементом управления. Имейте в виду, что элементы управления (кроме компонентов Label) должны иметь возможность "выбираться". Для возможности выбрать GroupBox или другой компонент, удедитесь, что их свойство TabStop установлено в True. Вы можете переместить управление на GroupBox, но, так как он не выделяется целиком, узнать, что он действительно имеет управление, достаточно непросто. Если вам не нужно передавать управление в контейнерные элементы (нижеследующий код исходит из этого предположения), то вы можете управлять элементами, просто перемещая управление в сам GroupBox.
В нижеследующем коде FormActivate является обработчиком события формы OnActivate, тогда как ProcessFormMessages никакого отношения к событиям формы не имеет. Не забудьте поместить объявление процедуры ProcessFormMessages в секцию 'Private' класса вашей формы.
Надеюсь, что вам помог.
Robert Wittig
{==================================================================} 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 OfWM_KEYDOWN : If Msg.wParam In [VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT] ThenBegin{ изменяем величину приращения взависимостиот состояния клавиши Shift }If GetKeyState ( VK_SHIFT ) And $80 = 0 ThenIncrement := 8ElseIncrement := 1; { Этот код перемещает управление на родительскийGroupBox, если один из его контейнерных элементовполучает фокус. Если вам необходимо управлятьэлементами внутри контейнера, удалите блок IF иизмените в блоке CASE TheControl на ActiveControl } If ( ActiveControl.Parent Is tGroupBox ) ThenTheControl := ActiveControl.ParentElseTheControl := ActiveControl; Case Msg.wParam OfVK_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; |