Delphi: Como atribuir um atalho de teclado de seta para cima ao Action/Menuitem e mantê -lo real para navegar no controle da lista (ListBox/VTV)?
Pergunta
Ajude -me: como atribuir um atalho de teclado de seta para cima ao item de ação ou menu e mantê -lo real para navegar no controle da lista (por exemplo, ListBox/Virtual TreeView/outro) ao mesmo tempo?
Obrigado!
Solução
Você comenta:
E o jogador do Winamp? Possui recursos de volume/volume para baixo, atribuídos à tecla de seta para cima e da tecla de seta para baixo correspondentemente .. Ok, se é impossível em Delphi, então ...
Mas certamente é possível, simplesmente não é uma boa ideia fazê -lo e contra as diretrizes de interação do Windows User Experience.
Mas se você estiver definido para implementá -lo, aqui está como. Substitua o seguinte método na sua classe de formulário que contém os componentes de ação:
function IsShortCut(var Message: TWMKey): Boolean; override;
E nele você pode impedir que a chave para cima e para baixo desencadeie as ações para as quais são atalhos:
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;
Observe que você também deve testar o estado de mudança correto e verifique se o seu código não quebra nenhum outro comportamento da janela que os usuários esperam, como mover a janela com as teclas de seta.
Outras dicas
No conjunto de propriedades do formulário KeyPreview := true
Em seguida, no evento KeyUp do evento de gravação do formulário, para verificar se você up a tecla é pressionada e faça com que ligue para o item de menu (neste item de menu de caso chamado 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;
Se você precisar da ação1 para ser executada, mesmo que o controle atual não seja a caixa de listagem, remova o and
parte de IF
declaração