Events Vb6.0如何将函数/子过程作为事件处理程序绑定到外部事件?

Events Vb6.0如何将函数/子过程作为事件处理程序绑定到外部事件?,events,vb6,ocx,Events,Vb6,Ocx,我需要构造一个VB6.0 ocx,它将用作一些外部VB6.0应用程序的插件 此ocx包含多个子过程,这些子过程被认为是某些外部事件(ocx外部)的事件处理程序 问题是,使用此ocx的用户只会调用我的一个ocx子过程一次,而且只调用一次。问题是,在这一次初始化时,如何将我的所有子进程/函数绑定到它们各自的外部事件,以便在它们的事件触发时调用我的过程 我设法在外部应用程序本身中做到了这一点,但当我将这些代码移植到OCX并将其用作外部vb程序中的插件时,就没有做到这一点 假设这是外部vb应用程序中的原

我需要构造一个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

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

虽然我以前从未处理过这种情况,但我记得在将控件动态添加到窗体时使用的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与数组一起使用。在这种情况下,我将创建一个包含事件的类,以帮助我处理相同类型的多个控件。

您会遇到什么错误?someExternalControl2是公共的吗?什么类型是someExternalControl。someExternalControl2的类型实际上是一些外部控件,实际名称是TesterControl。那么您可能需要在项目中引用TesterControl。我有,但它不起作用。使其不引发错误的唯一方法是,如果我在ocx中将其声明为vbcontrolExtender或对象,但这样做不会在事件触发时触发自定义事件处理程序。您会得到什么错误?请提供错误号和文本,并告诉我们这是编译错误还是运行时错误。ocxMyPlugin.object.someExternalControl2的类型是一些自定义控件。基本上,我正在尝试编写一个ocx,它将嵌入到一些我无法控制的外部vb应用程序中。该外部vb应用程序的开发人员(我的客户)同意,他的外部vb应用程序将调用这4行来加载我的ocx,并在其vb应用程序中调用我的ocx的一个过程,但他们不会在每个原始事件处理程序中嵌入任何额外的代码。问题是,当他们的外部vb应用程序触发了一些我感兴趣的vb事件时,我需要做一些事情。