Delphi: Как назначить ярлык клавиатуры AROW AROW на Action / Menuitem и сохранить его фактически для навигации по управлению списком (Listbox / VTV)?

StackOverflow https://stackoverflow.com/questions/2176519

Вопрос

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

Спасибо!

Это было полезно?

Решение

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

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

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

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

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;

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

Другие советы

На наборе свойств формы KeyPreview := true

Затем на соревнованиях на Keyup из события записи формы, чтобы проверить, нажата ли вы клавиша U выше и сделайте его вызовите пункт меню (в этом пункте меню «Действием»):

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;

Если вам нужно выполнить действие1, чтобы быть выполненным, даже если они текущий контроль не список Listbox, удалите and часть IF утверждение

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top