Delphi World - Использование клавиш для управления компонентами
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Использование клавиш для управления компонентами

Автор: Robert Wittig

Все, что написано на клаве
Ведет к погибели иль славе...

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

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования