TFrame中的EventHandler?

4

我有一个名为TVehicleEditForm的TForm,里面包含了3个完全相同的TVehicleUnitFrame组件。

我的想法是每个TVehicleUnitFrame实例都通过组件内部的eventhandler来处理自己的事件。但问题在于,这个eventhandler并没有被调用。

我曾试图通过覆盖Create方法,在组件内部通过代码分配eventhandler,但即使这样,handler也不会被调用。

但如果我在form外部为组件分配eventhandler,那么它就能正常工作。像这样:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;

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

我正在使用D2007。 有任何想法是什么原因吗?

问候 Roland

2个回答

12

当你从代码中执行时,它能够工作的原因是你替换了事件处理程序的指针,不管之前有什么。

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

在你的情况下,你希望在框架本身(例如我的示例中的 Unit1)中设置事件处理程序,因为它所引用的代码位于框架本身上。如果你这样做,它应该可以正常工作。如果你在使用该处理程序的地方(MyUnit)设置事件处理程序,则事件处理程序将被分配到那里。

Delphi 足够聪明,只要在你添加表单中的处理程序之前分配了该事件处理程序,它仍然会从你的框架中调用事件处理程序。如果你先在表单上添加它,然后再在框架上添加处理程序,则不会调用框架上的最后一个处理程序。

更糟糕的是,如果你在表单中删除处理程序,它仍然不会调用框架中的处理程序。

你需要做的是:

右键点击你的表单并选择“以文本形式查看”。向下滚动到框架。它应该是这样的:

inline FrameX: fraVehicleUnitFrame1

在此之下,寻找

inherited cmdNewOwner: TButton

在那里,您应该看到类似于:

OnClick = FormOldClickHandler

或者也许

OnClick = nil

删除此 OnClick 赋值,将视图查看为表单并保存。一切都应该没问题。如果现在在表单上选择该按钮(或 cmdNewOwner 的任何内容),则对象检查器应该在该事件旁边显示空白。


我通过从表单中移除框架实例并重新添加来解决这个问题,但是你的解决方案是最好的选择,特别是如果对框架实例进行了修改。 - Edwin Yip

1
这是一个老问题,但我在 Rio 10.3 中遇到了类似的问题。 在主窗体上,您可以单击“还原为继承”选项。 此选项位于“对象检查器”中的“事件”选项卡中。右键单击“OnItemClick”,然后单击“还原为继承”选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接