在TFrame里面的EventHandler?

时间:2009-07-10 13:39:05

标签: delphi event-handling delphi-2007 tframe

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

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

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

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

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

这只适用于一个按钮! 由于我在框架内有许多组件,这将导致许多任务...... 如果应该直接在对象检查器中完成这个相当难看的代码。

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

关心罗兰

2 个答案:

答案 0 :(得分:12)

当你从代码中执行它时,它的工作原理是你将指针替换为事件处理程序,无论以前是什么。

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

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

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

您需要做的是:

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

inline FrameX: fraVehicleUnitFrame1

在此之下,寻找

inherited cmdNewOwner: TButton

你应该看到类似的东西:

OnClick = FormOldClickHandler

或者

OnClick = nil

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

答案 1 :(得分:0)

这是个老问题,但在里约10.3中我遇到了类似的问题。 在主窗体上,您可以单击“还原到继承的”选项。

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