Советы по Delphi


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


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

После некоторых экспериметов я создал метод, который привожу ниже, способный перехватывать в форме все нажатые клавиши позиционирования и управлять ими выбранным в настоящий момент элементом управления. Имейте в виду, что элементы управления (кроме компонентов 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 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;
[000442]



Содержание раздела