我无法获得TActionToolBar的加速键。

这就是我正在做的(在D2006,XE4中可复制):


选择新建-> VCL表单应用程序
ActionManager1添加到表单
Action1中添加一个新动作ActionManager1,将动作标题设置为&Test
ActionToolBar1添加到表单
将项目添加到ActionManager.ActionBars并将ActionManager.ActionBars[0].ActionBar设置为ActionToolBar1
将项目添加到ActionManager.ActionBars[0].Items并将Action设置为Action1
设置Action1.OnExecute事件以显示消息
启动程序->工具栏显示得很好并且可以通过鼠标工作
按ALT + T->什么也没发生,但是叮叮的声音


我错过了哪一步?

最佳答案

正如现有的answer指出的那样,操作工具栏不支持此功能。

我个人的观点是,这被忽略了。工具栏按钮经常显示图像而不是文本可能是这样做的原因之一(至少对我而言)。但是,很明显,工具栏按钮在显示标题时具有功能,动作工具栏按钮也可以。

@Silver在comment中指出,动作栏具有查找加速项的功能。实际上,操作菜单使用了该功能。可以轻松将相同的功能集成到操作工具栏的TCustomForm.IsShortCut中,该工具栏已经迭代了操作列表以查找可能的快捷方式目标。

我们可以重写该方法并自己执行。下面的示例优先考虑默认处理,因此分配的快捷方式将禁止使用相同字符的键盘加速器,但是这种逻辑很容易颠倒。

function TForm1.IsShortCut(var Message: TWMKey): Boolean;
var
  Item: TActionClientItem;
  i: Integer;
begin
  Result := inherited IsShortCut(Message);
  if not Result and (KeyDataToShiftState(Message.KeyData) = [ssAlt]) then begin

    for i := 0 to ActionManager1.ActionBars.Count - 1 do begin
      if ActionManager1.ActionBars[i].ActionBar is TActionToolBar then begin
        Item := TActionToolBar(ActionManager1.ActionBars[i].ActionBar)
            .FindAccelItem(Message.CharCode);
        if Assigned(Item) and Item.ShowCaption and Assigned(Item.Action)
            and Item.Action.Execute then begin
          Result := True;
          Break;
        end;
      end;
    end;

  end;
end;

关于delphi - TActionToolBar的加速键不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57992263/

10-12 21:16