Delphi: come assegnare uno Scorciatoia da tastiera Freccia su per Azione / MenuItem, e Keep It effettivo per Navigazione del controllo List (ListBox / VTV)?
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!
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