在我的一个应用程序中,下拉菜单和弹出菜单共享一些菜单项(这些菜单项是动态构建的),因此我认为可以使用以下代码将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。我做错什么了吗?
发布于 2013-04-22 14:48:06
这是一个常见的错误消息。Delphi中的大多数可视化组件都不覆盖TPersistent.Assign。当该方法未被重写时,默认实现将接管,这只会抛出一个异常并填充源对象和目标对象的类名。我认为它没有实现,因为通常不清楚应该复制哪些属性,所以决定由您来决定,作为程序员。
如果您创建了要使用的类的后代,则可以实现Assign或AssignTo来复制所需的所有属性,但这可能不值得。相反,编写一个函数来进行复制可能是最简单的:
procedure AssignMenuItem(Target, Source: TMenuItem);对于菜单和按钮,最好的解决方案是使用TAction。分配操作的标题、图标、帮助ID和事件处理程序,然后将该操作与需要具有相同行为的所有按钮和菜单项相关联。他们都可以分享同样的行动。在运行时对操作属性的更改将自动反映在关联的可视控件中。
https://stackoverflow.com/questions/16148277
复制相似问题