Delphi: Как назначить сочетание клавиш со стрелкой вверх для Action/MenuItem и сохранять его актуальным для навигации по элементу управления списком (ListBox/VTV)?

Пожалуйста, помогите мне: Как назначить сочетание клавиш со стрелкой вверх для действия или элемента меню и сохранить его актуальным для одновременной навигации по элементу управления списком (например, ListBox/Virtual Treeview/other)?

Спасибо!

2 ответа

Решение

Вы комментируете:

А как насчет плеера Winamp? Он имеет функции увеличения / уменьшения громкости, назначенные клавишам со стрелками вверх и вниз соответственно. Хорошо, если это невозможно в Delphi, тогда...

но это, конечно, возможно, просто не очень хорошая идея, и это противоречит Руководству по взаимодействию с пользователем.

Но если вы настроены на реализацию, вот как. Переопределите следующий метод в своем классе формы, который содержит компоненты действия:

function IsShortCut(var Message: TWMKey): Boolean; override;

и в нем вы можете запретить клавишам "Вверх" и "Вниз" запускать действия, для которых они предназначены:

function TWeirdForm.IsShortCut(var Message: TWMKey): Boolean;
begin
  if (Message.CharCode in [VK_UP, VK_DOWN])
    // insert test whether message needs to go to the focused control instead
    and (...)
  then begin
    // insert calls to code that should be executed instead
    Result := False;
    exit;
  end;
  inherited;
end;

Обратите внимание, что вы должны также проверить правильность состояния сдвига и убедиться, что ваш код не нарушает поведение других окон, которое ожидает пользователь, например, перемещение окна с помощью клавиш со стрелками.

На свойствах формы установить KeyPreview := true

затем при событии KeyUp события записи формы проверить, нажата ли клавиша "Вверх", и заставить ее вызвать пункт меню (в этом случае пункт меню называется Action1):

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_UP) and (ActiveControl = ListBox1)then
    Action11.Click;
end;

procedure TForm1.Action11Click(Sender: TObject);
begin
  if ListBox1.ItemIndex >=0  then
    ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);
end;

Если вам нужно, чтобы действие Action1 было выполнено, даже если он не является списком Current Control, удалите and часть IF заявление

Другие вопросы по тегам