我有一个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。对原因有任何想法吗?
关心罗兰
答案 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”上单击鼠标右键,然后单击“恢复到继承的”选项。