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
заявление