2

我需要构建一个 VB6.0 ocx,它将用作一些外部 VB6.0 应用程序的插件

这个 ocx 包含几个子过程,它们应该作为一些外部事件(ocx 外部)的事件处理程序。

问题是,使用这个 ocx 的用户只会调用我的 ocx 子程序之一,而且只有一次。问题是,如何在一次初始化时将所有子过程/函数绑定到它们各自的外部事件,以便在它们的事件触发时调用我的过程?

我设法在外部应用程序本身中做到了这一点,但当我将这些代码移植到 OCX 并将其用作外部 vb 程序中的插件时却没有

假设这是外部 vb 应用程序中的原始事件处理程序:

   Private Sub someExternalControl1_someEvent(someParameter as boolean)
         MsgBox ("The original event handler")
   End Sub

如果我这样做,在那个 vb 应用程序中:

 dim withevents aaa as someExternalControl
 set aaa = someExternalControl1

那么这个自定义事件处理程序也将在每次事件触发时与原始事件处理程序一起被调用,如上所述

Private Sub aaa_someEvent(someParameter as boolean)
         MsgBox ("The custom event handler")
   End Sub

但是当我把它放在 OCX 中时,我做不到同样的事情。因为我做不到:

Public WithEvents ocxMyPlugin As VBControlExtender
...

Set ocxMyPlugin = Controls.Add("myprogID.usercontrolname", "somename", Me)
Set ocxMyPlugin.object.someExternalControl2 = someExternalControl   ' this will raise error
4

2 回答 2

1

虽然我从未处理过这种情况,但我还记得一些关于 VBControlExtender 对象的信息,当您将控件动态添加到窗体时会使用该对象。

闲逛我发现了这篇文章。然后是VBControlExtender上的 MSDN 文档。

特别是您想查看 ObjectEvent。

了解没有像在 .NET 中那样为事件动态分配方法的好方法。VB6 通过使用 WithEvents 关键字标注变量来处理事件。

然而,它是一个变量。因此,虽然您不能更改方法,但您也可以更改对象的变量点。

如果你有

Dim WithEvents X as SomeControl
Dim Y as New SomeControl
Dim Z as New SomeControl

Private Sub X_MyEvent(ByVal MyParm as Variant)

'Do Something like display the control name

End if

Public Sub TestY
   Set X = Y
End Sub

Public Sub TestZ
   Set X = Z
End Sub

如果您在 TestY 之后激活事件,则 X_MyEvent 将处理控件 Y 的事件,如果您在 TestZ 之后激活事件,则 X_MyEvent 将处理控件 Z 的事件。

使用 VBControlExtender,您可以通用地处理不同的控件。如果您实例化多个相同类型的控件,那么您有很多工作要做。您不能将 withevent 与数组一起使用。在这种情况下,我会创建一个带有事件的类来帮助我处理相同类型的多个控件。

于 2009-11-04T13:36:08.647 回答
0

我可能需要更多细节来帮助。ocxMyPlugin.object.someExternalControl2 的类型是什么。如果目标应用程序不知道它,您将遇到后期绑定问题。但是,您可以在第三个(或第四个项目)上创建一个包装器或接口,这可能会解决您的问题。发布您的设计以及您想要实现的目标很重要。可能还有其他方法可以代替。

于 2009-11-04T08:13:42.193 回答