【问题标题】:delphi non-visual event handling in a dlldll中的delphi非可视事件处理
【发布时间】:2013-09-20 05:45:22
【问题描述】:

我有一个已导入 Delphi XE2 并为其创建 TLB 文件的第 3 方 Active X .ocx 文件。

Active X 库是一个“非可视”组件,但如果拖放到表单上则会显示为图像。

我想在 Active X 库中调用这个组件,并且可以正常访问它的方法和属性,但不知道如何访问它的事件。 我想我也许可以将它添加到数据模块中,但这似乎不能作为工具面板中的选项使用。这应该可能吗?

我尝试通过执行以下操作来添加事件: actX3Party := T3Party.Create(nil); actX3Party.On3PartyEvent := myEventHandler;

但不知道如何将“myEventHandler”设置为事件处理程序,因为没有表单。

谢谢

【问题讨论】:

    标签: delphi events activex ocx


    【解决方案1】:

    您不需要表单来实现事件处理程序。你所需要的只是一堂课。您可以使用实例方法或类方法来实现事件处理程序。当然,如果你选择使用实例方法,那么你需要实例化一个实例。

    所以,决定你是要使用实例方法还是类方法。然后创建一个定义事件处理程序的类。如果您使用实例方法,请实例化该类。最后,将您的处理程序分配给事件。

    例如:

    type
      TMyClass = class
      public
        class procedure MyHandler1(Sender: TObject);
        procedure MyHandler2(Sender: TObject);
      end;
    

    我不知道你的事件接收到什么参数,所以上面只是举例说明。显然,您需要实现这些方法。

    你可以立即使用类过程:

    actX3Party.On3PartyEvent := TMyClass.MyHandler1;
    

    对于实例方法,做一个实例:

    myInstance := TMyClass.Create;
    actX3Party.On3PartyEvent := myInstance.MyHandler2;
    

    如果将事件处理程序分配给 ActiveX 控件的代码存在于一个类中,那么您不需要另一个类。您可以在该类中实现您的处理程序。

    因此,再一次,事件处理程序不需要在表单中实现。它们只是一个类的方法。

    【讨论】:

    • 从技术上讲,完全可以不使用类来实现事件处理程序。您可以使用TMethod 记录和类型转换来完成同样的事情。唯一的要求是您必须向事件处理程序添加一个额外的显式参数以容纳Self 值,但TMethod 允许您为Self 参数指定您想要的任何值。它不需要是对象指针或类引用。
    • @RemyLebeau 从技术上讲确实如此。我认为这种详细程度在这里不合适。
    • 由于 OP 询问如何在没有表单的情况下创建事件处理程序,我认为值得一提的是存在一种无类方法。
    • @Remy 你会那样做吗?或者你会以允许编译器确保类型安全的方式来做吗?
    • 我已经做到了两种方式。这取决于实际情况。但是使用 Form/DataModule 创建事件处理程序并不能保证类型安全,因为 DFM 会丢弃事件处理程序的所有类型信息。版本之间的事件签名更改不会反映在 DFM 中,并且可能会导致仅在运行时出现的错误。此外,使用 Form/DataModule 以可视方式而不是可编程方式连接事件处理程序不允许任何类型的编译器验证,因为不会调用编译器。 IDE 会根据 RTTI 进行验证,而且有时会出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多