Delphi: come assegnare uno Scorciatoia da tastiera Freccia su per Azione / MenuItem, e Keep It effettivo per Navigazione del controllo List (ListBox / VTV)?

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

Domanda

Si prega di aiutare me:? Come assegnare un tasto di scelta rapida freccia su per azione o voce di menu, e tenerlo reale per la navigazione del controllo elenco (ad esempio ListBox / virtuale Treeview / altro) allo stesso tempo

Grazie!

È stato utile?

Soluzione

commento:

  

E per quanto riguarda il lettore Winamp? Ha Volume su / Volume giù funzioni assegnate al tasto freccia su e giù sulla tastiera corrispondentemente .. Va bene, se questo impossibile in Delphi, allora ...

, ma è certamente possibile, semplicemente non è una buona idea per farlo, e contro le linee guida User Experience Interaction di Windows.

Ma se si sta insieme sulla sua attuazione, ecco come. Eseguire l'override del seguente metodo nella classe form che contiene i componenti di azione:

function IsShortCut(var Message: TWMKey): Boolean; override;

e in essa si può evitare che la chiave su e giù dalla innescare le azioni che sono scorciatoie per:

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;

Si noti che si dovrebbe verificare lo stato di spostamento corretto troppo, e verificare che il codice non si rompe tutti gli altri utenti di comportamento finestra si aspettano, come lo spostamento della finestra con i tasti freccia.

Altri suggerimenti

Sulle proprietà modulo riportato KeyPreview := true

poi su KeyUp eventi della manifestazione modulo di scrittura per verificare se viene premuto fino chiave e fanno chiamare la voce di menu (su questa voce di menu denominata caso 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 avete bisogno di Action1 da eseguire, anche se il controllo attuale non è la casella di riepilogo, rimuovere la parte and della dichiarazione IF

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top