助けてください: 上矢印キーボード ショートカットをアクションまたはメニュー項目に割り当て、同時にリスト コントロール (例: ListBox/Virtual Treeview/other) をナビゲートするためにそれを実際に維持する方法は?
ありがとう!
あなたのコメント:
そして、Winamp プレーヤーはどうですか? それに対応して上矢印キーと下矢印キーに割り当てられた音量アップ/音量ダウン機能があります..わかりました、Delphiでそれが不可能な場合は...
しかし、それは確かに可能です。それを行うのは良い考えではなく、Windows ユーザー エクスペリエンス インタラクション ガイドラインに反します。
しかし、それを実装することに決めた場合は、次の方法があります。アクション コンポーネントを含むフォーム クラスで次のメソッドをオーバーライドします。
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イベントで、Upキーが押されているかどうかを確認し、メニュー項目(この場合は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;
Current ControlがリストボックスでなくてもAction1を実行する必要がある場合は、ステートメントのand
一部を削除してくださいIF