4

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

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

错误的。我收到了两次插入的EMenuError消息菜单。理性的,所以我改变了我的代码,使用这个代码有我的菜单项的两个实例:

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

又错了。我收到一条EConvertError消息:无法将 TMenuItem 分配给 TMenuItem。我做错什么了吗?

4

1 回答 1

6

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

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

procedure AssignMenuItem(Target, Source: TMenuItem);

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

于 2013-04-22T14:48:06.730 回答