delphi - 启用 VCL 样式时的 TActionMainMenuBar 绘制错误
问题描述
TActionMainMenuBar 中存在一个关键且易于重现的错误,该错误仅在启用 VCL 样式时发生,我想知道是否有人已经看到它并找到任何解决方法。我正在使用最新的 Delphi 10.3.3 Rio(也发生在 10.4.1 Sydney),而不是使用高 DPI 显示器。
重新创建它的步骤:
- 创建一个新的 Delphi VCL 应用程序。通过项目选项启用 VCL 样式。为其分配任何内置样式。
- 向其中添加 3 个组件:TActionManager、TActionMainMenuBar 和一个 TCustomizeDlg。通过 ActionManager 属性链接 TActionMainMenuBar 和 TActionManager。还将 TCustomizeDlg 链接到 ActionManager。
- 现在,向 ActionManager 组件添加一些操作。在我的示例中,我添加了 4 个 DataSet 标准操作 + 3 个 Dialog 标准操作。
- 将新创建的操作拖放到 ActionMainMenuBar,因此现在有 2 个顶部菜单项,第一个具有 4 个操作,第二个具有 3 个操作。看图片
- 现在将此代码添加到一些用户触发的事件中(我使用了 ActionMainMenuBar DblClick 事件):
procedure TForm9.ActionMainMenuBar1DblClick(Sender: TObject);
begin
CustomizeDlg1.Show;
end;
- 运行应用程序并双击 ActionMainMenuBar。显示 CustomizeDlg 并且操作主菜单栏进入设计模式,允许您对其进行自定义。
- 从对话框中拖动一个动作并将鼠标移动到第二个顶部菜单项上(它将下拉并且所有 3 个项都将可见)。见下图:
- 现在将鼠标移动到另一个顶部菜单操作(该示例中的 DataSet)并将其移回 Dialog 菜单项。现在菜单的绘制完全被打破了:
从现在开始,菜单的绘制将中断,直到您关闭 CustomizeDlg。
到目前为止我所知道的:
- 如果未启用 VCL 样式,则不会发生此问题。
- 该错误与 CustomizeDlg 无关,而是与进入 DesignMode 时的 ActionMainMenuBar 相关(祖先 TCustomActionBar 有一个名为 DesignMode 的属性)。
- 它至少发生在 Delphi 10.3.3 Rio 和 10.4.1 Sydney。可能是其他人
不幸的是,调试这种场景非常耗时,有时无法直接调试(调试本身会在处理鼠标消息时改变场景等)
是否有任何已知的修复、补丁或解决方法(除了禁用不是选项的 VCL 样式)?
解决方案
推荐阅读
- flutter - 在flutter中输入新信息后如何创建动态页面(新页面)
- php - PHP在现有查询中动态添加新列和值
- javascript - 将 handleSubmit() 传递给子组件不会修改父组件的状态
- c# - 使用泛型将具有相同属性的 A 类和 B 类的泛型列表转换为 C 类的列表
- r - 如何使用任务计划程序将文件上传到 R 中的谷歌驱动器
- excel - 将 OLEObject 中的所有内容(包括带格式的页眉页脚)复制到新的 Word.Document/Word.Application
- php - Laravel-Dompdf ErrorException Cpdf.php,未定义索引 3923
- javascript - 转换为 [string, string][] 数据类型
- php - 为什么我的 .htaccess 文件在添加斜杠时会导致某些文件出现内部错误?
- php - 将字符串分解为数组 (PHP)