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

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

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

А как насчет плеера 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;

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

0 голосов
/ 01 февраля 2010

В свойствах формы установить 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

...