delphi动作管理器快捷键+, - ,输入动作

时间:2011-12-28 11:25:36

标签: delphi keyboard-shortcuts delphi-7

我正在开发 delphi 7 ,我有一个应用程序,我使用操作管理器来创建操作,然后为它们分配快捷方式 动作管理器中的快捷方式已在快捷方式属性中定义。但我希望有一个快捷方式,如

 1. ADD ,that is the + on the numpad
 2. Subtract key ,that is the - on the numpad
 3. divide key  , that is the / on the numpad.
 4. enter key

我尝试将自己的快捷方式指定为减去添加但是它给了我这个错误消息 enter image description here

我也尝试过 - 但没有发生任何事情

我的代码跟踪行动

  var
      Action : TBasicAction;
      begin
        Action := Sender as TBasicAction;
       if (Action is TAction) and not TAction(Action).Enabled then   exit;
      case Action.tag of
        1                  :         ShowMessage('ADD + pressed');
        2                  :         ShowMessage ('divide / pressed');
        3                  :         ShowMessage ('subtract - pressed');
        4                  :         ShowMessage ('enter pressed');
      end;

   end;

我可以使用正常的

   **GetKeyState(VK_ADD) AND 128)=128;** OR **GetKeyState(VK_return) AND 128)=128;** 

找到按键的按键 在keypress或keydown事件中,但我想使用动作管理器快捷方式

3 个答案:

答案 0 :(得分:8)

您可以在运行时分配它们:

Action1.ShortCut := menus.ShortCut(VK_ADD, []);
Action2.ShortCut := menus.ShortCut(VK_SUBTRACT, []);

答案 1 :(得分:7)

这些键具有以下特殊名称,可以通过Object Inspector中的ShortCut属性直接指定。

  • NUM ADD
  • NUM SUB
  • NUMMULT
  • /

我不确定numpad Enter 键。我不知道它是否有一个特殊的名称,或者确实是否可以使用快捷方式区分普通的 Enter 键。

<强>更新

事实证明,这些密钥的名称因机器而异。 François指出这些名称来自GetKeyNameText Windows API函数,文档指出:

  

键名字符串的格式取决于当前的键盘布局。键盘驱动程序以名称长度超过单个字符的键的字符串形式维护名称列表。键名根据当前安装的键盘的布局进行翻译,因此该功能可能会为不同的输入区域设置提供不同的结果。

例如,Sertac发现在他的系统上,名称为NUM +NUM -等。

我通过调用ShortcutToText生成了值,您也可以这样生成适合您系统的名称。

答案 2 :(得分:1)

您不仅可以为键组成名称,还希望Object Inspector知道您的意思。 ShortCut属性不是字符串;它是TShortCut,只能分配一个可以转换为TShortCut的值。

键盘上没有名为ADDsubtractdivide的键,因此无法将其分配给ShortCut;它们不存在,因此无法转换为TShortCut

您可以将快捷方式直接设置为 + - / 输入(值{ {1}},+-/),它们应该可以正常运行。 (虽然分配常见的单击键通常不是一个好主意 - 如果表单只有一个单独的东西可以响应Enter键,它可能没问题;如果有编辑控件或可能的东西理智地接收+密钥然后这是一个可怕的想法,因为当用户不打算这样做时,快捷方式的动作可能会触发。)

正如大卫指出的那样,这不会取得数字键盘部分的要求。为此,您必须在代码中分配+

ShortCut

但是,我找不到任何方法来区分NUMPAD Enter和使用虚拟键定义的常规输入。您可能需要使用修饰符或按键事件来执行此操作。

至于确定使用哪一个,你应该适当地命名它们(如procedure TForm1.FormCreate(Sender: TObject); begin AddAction.ShortCut := Shortcut(VK_ADD, []); SubtractAction.ShortCut := ShortCut(VK_SUBTRACT, []); DivideAction.ShortCut := ShortCut(VK_DIVIDE, []); end; AddActionSubtractActionDivideAction),然后您实际上可以在EnterActionOnUpdate事件中按名称引用它们:

OnExecute