我无法获得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/