2009-07-10 26 views
4

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

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

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

但是,如果我从窗体外部指定eventhandler它工作正常。 喜欢分享:

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

这只是一个按钮! 因为我在框架内有很多组件,这将导致许多任务...... 相当丑陋的代码,当这应该直接在对象检查器中完成。

我正在使用D2007。任何想法的原因?

问候罗兰

回答

11

它的工作原理,当你从代码做到这一点,是要装上指针的事件处理程序,无论之前是什么在那里的原因。

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

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

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

你需要做的是这样的:

右键Clcik表单,选择查看文本。向下滚动到框架。它应该是这样的:

inline FrameX: fraVehicleUnitFrame1 

在其下方,寻找

inherited cmdNewOwner: TButton 

在那里,你应该看到类似:

OnClick = FormOldClickHandler 

或许

OnClick = nil 

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

+0

感谢您的意见!我再次工作:) 非常感谢 – 2009-07-10 16:56:03