关于将TMenuItem实例分配给另一个实例的EConvertError

时间:2013-04-22 13:24:33

标签: delphi delphi-xe2

在我的一个应用程序中,下拉菜单和弹出菜单共享一些菜单项(动态构建),所以我想我可以使用以下代码将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 。我做错了吗?

1 个答案:

答案 0 :(得分:6)

这是一个常见的错误消息。 Delphi中的大多数可视组件都不会覆盖TPersistent.Assign。当该方法未被覆盖时,默认实现将接管,这将简单地抛出异常并填写源和目标对象的类名。我认为它没有实现,因为它一般都不清楚究竟应该复制哪些属性,所以作为程序员,决定权留给你。

如果你是你正在使用的类的后代,你可以实现AssignAssignTo来复制你想要的所有属性,但这可能不值得。相反,编写执行复制的函数可能最简单:

procedure AssignMenuItem(Target, Source: TMenuItem);

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