首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TFrame中的EventHandler?

TFrame中的EventHandler?
EN

Stack Overflow用户
提问于 2009-07-10 13:39:05
回答 2查看 2.7K关注 0票数 4

我有一个TForm (TVehicleEditForm),里面有3个相同的TFrames (TVehicleUnitFrame)。

这个想法是,框架的每个实例都通过框架内的eventhandler处理自己的事件。问题是eventhandler没有被调用。

我试图通过重写Create方法来通过框架内的代码分配eventhandler,但在这种情况下也不会调用处理程序。

但是,如果我在表单的框架外指定eventhandler,它就能正常工作。如下所示:

代码语言:javascript
运行
复制
fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;

这只是一个按钮!由于框架中有许多组件,这将导致许多赋值……相当丑陋的代码,而这应该直接在对象检查器中完成。

我正在使用D2007。知道原因了吗?

问候罗兰

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-10 14:02:47

当您在代码中执行此操作时,它起作用的原因是您替换了指向事件处理程序的指针,而不管以前在那里有什么。

在设计时,我有两个可能的位置来设置处理程序。假设我在Unit1中有Frame1,并且我把它放在MyUnit中的MyForm上,我将有机会在这两个地方设置事件处理程序。

在本例中,您希望在框架本身中设置事件处理程序(在我的示例中为Unit1),因为它引用的代码位于框架本身上。如果你这样做了,它应该是有效的。如果将事件处理程序设置在使用它的位置(MyUnit),则事件处理程序将被分配到该位置。

Delphi足够聪明,仍然可以从您的框架中调用事件处理程序,只要该事件处理程序是在您在表单中添加事件处理程序之前分配的。如果您首先将其添加到窗体上,然后将处理程序添加到框架上,则框架上的最后一个处理程序是而不是 called。更糟糕的是,如果移除表单中的处理程序,它仍然不会调用框架上的处理程序。

你需要做的是:

右键单击您的表单并选择View as Text。向下滚动到框架。它应该是这样的:

代码语言:javascript
运行
复制
inline FrameX: fraVehicleUnitFrame1

在它的下面,寻找

代码语言:javascript
运行
复制
inherited cmdNewOwner: TButton

在那里,您应该会看到类似以下内容:

代码语言:javascript
运行
复制
OnClick = FormOldClickHandler

或者也许

代码语言:javascript
运行
复制
OnClick = nil

删除此OnClick分配,再次以表单形式查看,然后保存。一切都应该很好。如果您现在选择窗体上的按钮(或任何cmdNewOwner ),对象检查器应该不会在该事件旁边显示任何内容。

票数 12
EN

Stack Overflow用户

发布于 2019-02-15 19:37:36

这是一个老问题,但我在Rio 10.3中遇到了类似的问题。在主窗体上,您可以单击"Revert to inherited“选项。

此选项位于“对象感知器”中的“事件”选项卡上。在“OnItemClick”上单击鼠标右键,然后单击选项“Revert to inherited”。

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

https://stackoverflow.com/questions/1109574

复制
相关文章

相似问题

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