如何解决如何在 ActionMainMenuBar 中禁用菜单项并停止下拉菜单?
德尔福 10.4.2 我的 TActionMainMenuBar 有问题。当我在代码中禁用菜单项时,它看起来已禁用,但如果我下拉它旁边的启用菜单项,然后移动到禁用菜单项,其子菜单会下拉! 如果这不是错误,有没有办法防止禁用的菜单项下拉?
谢谢 托尼
解决方法
一个简单的解决方案是在项目被禁用时在 TActionMainMenuBar.OnPopup
事件中关闭菜单:
procedure TForm1.ActionMainMenuBar1Popup(Sender: TObject; Item: TCustomActionControl);
begin
if not Item.Enabled then
ActionMainMenuBar1.CloseMenu;
end;
但是我不建议这样做,因为它也会退出菜单循环,这可能会导致糟糕的用户体验。
您描述的行为可视为缺陷,您可以report it to Embarcadero。要在您的代码中解决此问题,您应该覆盖 CreatePopup
的 TActionMainMenuBar
方法以防止为禁用的项目创建弹出菜单(返回 nil
)。但是,当使用键盘上的 ↑ 或 ↓ 打开子菜单时,在该方法中返回 nil
会导致另一个问题(访问冲突)。因此,您也应该通过修补 WMKeyDown
来处理这种情况。理想情况下,您应该从 TActionMainMenuBar
派生自己的类或使用 interposer class:
type
TActionMainMenuBar = class(Vcl.ActnMenus.TActionMainMenuBar)
private
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
protected
function CreatePopup(AOwner: TCustomActionMenuBar;
Item: TCustomActionControl): TCustomActionPopupMenu; override;
end;
{ ... }
function TActionMainMenuBar.CreatePopup(AOwner: TCustomActionMenuBar;
Item: TCustomActionControl): TCustomActionPopupMenu;
begin
if Item.Enabled then
Result := inherited CreatePopup(AOwner,Item)
else
Result := nil;
end;
procedure TActionMainMenuBar.WMKeyDown(var Message: TWMKeyDown);
begin
if Assigned(Selected) and (not Selected.Control.Enabled) and
(Orientation in [boLeftToRight,boRightToLeft]) and
(Message.CharCode in [VK_UP,VK_DOWN]) then
Exit; { do not try to popup disabled items }
inherited;
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。