Delphi: Как назначить ярлык клавиатуры AROW AROW на Action / Menuitem и сохранить его фактически для навигации по управлению списком (Listbox / VTV)?
Вопрос
Пожалуйста, помогите мне: как назначить ярлык клавиатуры со стрелкой вверх к действию или элементу меню, и сохранить его фактически для навигации по управлению списком (например, 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
утверждение