首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EConvertError将TMenuItem实例分配给另一个实例

EConvertError将TMenuItem实例分配给另一个实例
EN

Stack Overflow用户
提问于 2013-04-22 13:24:32
回答 1查看 670关注 0票数 4

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

代码语言:javascript
复制
MI := TMenuItem.Create(nil);
{ set MI action }
DropDownMenu.Add(MI);
PopupMenu.Items.Add(MI);

不对。我得到了一个带有消息菜单的EMenuError,插入了两次。因此,我使用以下代码将代码更改为菜单项的两个实例:

代码语言:javascript
复制
MI := TMenuItem.Create(nil);
{ set MI action }
PopupMenu.CreateMenuItem.Assign(MI);
DropDownMenu.Add(MI);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-22 14:48:06

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

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

代码语言:javascript
复制
procedure AssignMenuItem(Target, Source: TMenuItem);

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16148277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档