4

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

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

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

但是,如果我从表单中分配eventhandler框架的外部,它就可以正常工作。像这样:

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

这仅适用于一个按钮!由于我在框架中有许多组件,这将导致许多分配......当这应该直接在对象检查器中完成时,这是相当丑陋的代码。

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

问候罗兰

4

2 回答 2

12

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

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

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

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

你需要做的是:

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

inline FrameX: fraVehicleUnitFrame1

在这之下,寻找

inherited cmdNewOwner: TButton

在那里你应该看到类似的东西:

OnClick = FormOldClickHandler

也许

OnClick = nil

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

于 2009-07-10T14:02:46.563 回答
1

这是老问题,但我在 Rio 10.3 中遇到了类似的问题。在主窗体上,您可以单击“恢复为继承”选项。

此选项位于“对象检查器”中的“事件”选项卡上。在“OnItemClick”上单击鼠标右键,然后单击“恢复为继承”选项。

于 2019-02-15T11:37:35.607 回答