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)?

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

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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top