【问题标题】:EventHandler inside a TFrame?TFrame 中的 EventHandler?
【发布时间】:2010-11-09 17:20:35
【问题描述】:

我有一个 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。知道原因吗?

问候罗兰

【问题讨论】:

    标签: delphi event-handling delphi-2007 tframe


    【解决方案1】:

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

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

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

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

    你需要做的是:

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

    inline FrameX: fraVehicleUnitFrame1
    

    在下面,寻找

    inherited cmdNewOwner: TButton
    

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

    OnClick = FormOldClickHandler
    

    或许

    OnClick = nil
    

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

    【讨论】:

    • 我通过从表单中删除框架实例并重新添加来解决这个问题,但是您的解决方案是最好的方法,特别是如果对框架实例进行了修改。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 1970-01-01
      • 2012-09-18
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多