我需要构建一个VB6.0 ocx,它将用作一些外部VB6.0应用程序的插件
这个ocx包含几个子程序,它们可以用作某些外部事件的事件处理程序(外部到ocx)。
问题是,使用此ocx的用户只会调用一次我的ocx子过程,只调用一次。问题是,如何在一次初始化时将所有子过程/函数绑定到各自的外部事件,以便在事件触发时调用我的过程?
我设法在外部应用程序本身中执行此操作,但是当我将这些代码移植到OCX并将其用作外部vb程序中的插件时
假设这是外部vb app中的原始事件处理程序:
Private Sub someExternalControl1_someEvent(someParameter as boolean)
MsgBox ("The original event handler")
End Sub
并且在那个vb app中,如果我这样做:
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
答案 0 :(得分:1)
虽然在我记得有关在动态添加控件到表单时使用的VBControlExtender对象之前,我从未处理过这种情况。
我四处寻找article。然后这个MSDN文档在VBControlExtender。
特别要查看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。在这种情况下,我会创建一个包含事件的类来帮助我处理相同类型的多个控件。
答案 1 :(得分:0)
我可能需要更多细节才能提供帮助。 ocxMyPlugin.object.someExternalControl2 的类型是什么。如果目标应用程序未知,则会遇到有关后期绑定的问题。但是,您可以在第三个(或第四个项目)上创建一个包装器或接口,这可以解决您的问题。发布您的设计以及您想要实现的目标非常重要。也许还有其他可以使用的方法。