Rol*_*son 4 delphi event-handling delphi-2007 tframe
我有一个TForm(TVehicleEditForm)里面有3个相同的TFrames(TVehicleUnitFrame).
这个想法是框架的每个实例都通过框架eventhandler内部处理自己的事件.问题是eventhandler没有调用.
我试图eventhandler通过覆盖Create方法在框架内分配by代码,但在这种情况下也不会调用处理程序.
但是如果我eventhandler从表单中指定框架外部它可以正常工作.像这样:
fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;
Run Code Online (Sandbox Code Playgroud)
这只适用于一个按钮!因为我在框架内有许多组件,这将导致许多分配...当这应该直接在对象检查器中完成时,相当丑陋的代码.
我正在使用D2007.对原因有什么看法?
关心罗兰
Cob*_*ger 12
当你从代码中执行它时,它的工作原理是你将指针替换为事件处理程序,无论以前是什么.
在设计时,我有两个可能的地方来设置处理程序.假设我在Unit1中有Frame1并将其放在MyUnit中的MyForm上,我将有机会在两个地方设置事件处理程序.
在您的情况下,您希望在帧本身中设置事件处理程序(在我的示例中为Unit1),因为它引用的代码在帧本身上.如果你这样做,它应该工作.如果在使用它的位置(MyUnit)上设置事件处理程序,那么将在那里分配事件处理程序.
只要在您在表单中添加事件处理程序之前分配了该事件处理程序,Delphi就足够聪明,仍然可以从您的帧中调用事件处理程序.如果您首先将其添加到窗体上,然后在框架上添加处理程序,则不会调用框架上的最后一个.更糟糕的是,如果你删除表单中的处理程序,它仍然不会调用框架上的处理程序.
你需要做的是:
右键单击表单,然后选择"以文本形式查看".向下滚动到框架.它应该是这样的:
inline FrameX: fraVehicleUnitFrame1
Run Code Online (Sandbox Code Playgroud)
在那之下,寻找
inherited cmdNewOwner: TButton
Run Code Online (Sandbox Code Playgroud)
你应该看到类似的东西:
OnClick = FormOldClickHandler
Run Code Online (Sandbox Code Playgroud)
也许
OnClick = nil
Run Code Online (Sandbox Code Playgroud)
删除此OnClick分配,再次以表单形式查看并保存.一切都应该好.如果现在选择窗体上的按钮(或任何cmdNewOwner),则对象检查器应该在该事件旁边不显示任何内容.
| 归档时间: |
|
| 查看次数: |
2096 次 |
| 最近记录: |