gpt4 book ai didi

delphi - 将 TMenuItem 实例分配给另一个实例时出现 EConvertError

转载 作者:行者123 更新时间:2023-12-03 15:25:23 25 4
gpt4 key购买 nike

在我的一个应用程序中,下拉菜单和弹出菜单共享一些菜单项(动态构建的),所以我想我可以使用此代码将 TMenuItem 实例添加到两个菜单中:

MI := TMenuItem.Create(nil);
{ set MI action }
DropDownMenu.Add(MI);
PopupMenu.Items.Add(MI);

错了。我收到一个EMenuError,其中包含消息菜单插入两次。 Rational,因此我更改了代码,使用以下代码获得菜单项的两个实例:

MI := TMenuItem.Create(nil);
{ set MI action }
PopupMenu.CreateMenuItem.Assign(MI);
DropDownMenu.Add(MI);

又错了。我收到带有以下消息的 EConvertError:无法将 TMenuItem 分配给 TMenuItem。我做错了什么吗?

最佳答案

这是一个常见的错误消息。 Delphi 中的大多数可视化组件不会重写TPercient.Assign。当该方法未被重写时,默认实现将接管,它只是抛出异常并填充源对象和目标对象的类名。我认为它尚未实现,因为通常不清楚应该复制哪些属性,因此决定权留给了作为程序员的您。

如果您创建正在使用的类的后代,则可以实现 AssignAssignTo 来复制所需的所有属性,但这可能不值得的努力。相反,最简单的方法可能是编写一个执行复制的函数:

procedure AssignMenuItem(Target, Source: TMenuItem);

对于菜单和按钮,最好的解决方案是使用TAction。指定操作的标题、图标、帮助 ID 和事件处理程序,然后将该操作与需要具有相同行为的所有按钮和菜单项相关联。他们都可以共享相同的 Action 。运行时对操作属性的更改将自动反射(reflect)在关联的可视控件中。

关于delphi - 将 TMenuItem 实例分配给另一个实例时出现 EConvertError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16148277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com