VB6.0动态加载ActiveX控件

翻译|其它|编辑:郝浩|2004-01-20 11:48:00.000|阅读 2588 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

一、概 述
  在实际工程应用中,有时需要在程序运行时动态加载ActiveX控件,以满足不同的应用条件或用户输入,因此有必要研究动态加载ActiveX控件的实现方法。
----一个控件要在Windows中使用,必须将其在Windows中注册。注册ActiveX控件一般来说有三种途径:1.使用Regsvr32.exe程序对ActiveX控件进行注册;2.使用安装程序进行注册; 3.利用Windows API 函数进行注册。

----为了保护控件不被非法用户使用,VB提供了加许可证(License)功能。当生成控件时选择了加许可证选项,生成的控件会含有许可证码(包含在.vbl文件中)。当向其他机器安装该控件时,该许可证码会自动安装在该机器的注册表中,而如果仅复制控件到该机器并注册它,则复制机器注册表中没有控件的许可证码,控件不可使用。

二、实现方法
----以下是不同情况下动态加载控件的实现方法。
----1.控件在应用程序的窗体(Form)上

----这种情况适合于应用程序中需要该控件,但需要控件实例的具体数量不定。实现方法是首先从工具箱中拖动需要的控件到窗体上;然后将控件的 index属性设为0(生成一个控件实例数组);最后编程实现控件实例的加载卸载。

Dim iControlIndex As Integer
‘加载控件实例的索引值
Private Sub LoadControl(iIndex As Integer)
Load UserControl11(iIndex)
‘加载控件实例,UserControl11是自定义控件名字
UserControl11(iIndex).Visible = True
End Sub
Private Sub UnloadContr(iIndex As Integer)
Unload UserControl11(2)
‘卸载控件实例,当不使用控件实例时自动卸载
End Sub
Private Sub UserControl11_Done(Index As Integer)
‘根据控件实例的索引决定相应控件实例作出响应
Select Case Index
Case 0
Case 1
......
End Sub

----2.控件在应用程序工具箱(TOOLBOX)中,但没有添加到应用程序中

----这种情况适合于为了完成不同的任务,制作了多个不同功能的控件,在特定条件下只需要一个或几个控件即可。实现方法是将所有可能用到的控件加到VB工具箱中,当应用程序执行时,根据需要由程序自动加载控件。
Dim WithEvents oControl As VBControlExtender

  动态加载控件虽然实现了控件的动态加载,但不能预先设计加载控件的响应事件代码,如:预先设计处理事件代码Sub sZlfPrinr1_Click() 将是非法的,当然,可以将要响应的事件封装在控件内部,但这样降低了控件的灵活性。

  WithEvents 关键词使VBControlExtender控件实例能提供事件捕捉陷井,VBControlExtender对象对动态添加控件特别有用,它提供了一套通用的属性、方法、事件给开发人员。

Private Sub LoadControl() ‘加载控件
If Not oControl Is Nothing Then
‘首先判断控件是否存在,若存在则先卸载
Controls.Remove (“szlfPrint1") ‘卸载控件实例
End If
Licenses.Add “test.usercontrol1",
“9CA5E0CC-37D7-11D4-
8547-00A024EE55CD =
uohhlohhhhmoooiouijoohloririmhlhtoqi"
‘如果控件需要许可证码,则需先填加许可证码
Set oControl = Me.Controls.Add(
“test.usercontrol1",“szlfPrint1", Frame1)
‘test.usercontrol是控件的对象编号,
可通过VB的Object Browser得到控件的对象编号,
szlfPrint1是控件的名字,Frame1是控件的容器。
oControl.Visible = True
End Sub
Private Sub UnloadControl() ‘卸载控件实例
If Not oControl Is Nothing Then
Controls.Remove (“szlfprint1")
Set oControl = Nothing
End If
End Sub
Private Sub CmdTest_Click()
‘测试程序,可以像静态加载控件
那样使用控件实例的属性及方法
oControl.Visible = False
oControl.DoMsg
oControl.NodeCode = “dd"
End Sub
Private Sub oControl_ObjectEvent(Info As EventInfo)
Select Case Info.Name
Case “MouseDown"
oControl.DoMsg
Case “click"
MsgBox “Click"
‘双击处理代码
Case Else ‘
End Select
End Sub

----ObjectEvent(Info As EventInfo)能捕捉到控件使用 RaiseEvent产生的所有事件,EventInfo数据结构映射了事件的名称、参数个数和参数的值。

  值得注意的是,由于控件在工具箱中而没有在应用程序中,当程序运行时会报错,需把程序的工程属性Remove information about unused Activex Controls 设为不选。

----3.控件在应用程序运行机器上,但没有在工具箱中

----这种情况适合于在较大工程项目中,开发者彼此分工合作,控件由第三方提供,制作应用程序的开发者没有此控件,但要安装的机器有这个控件。

----这种情况的实现方法与情况2类似,并可以实现控件的动态注册及撤消注册,但应用程序无法访问控件的方法及部分属性。

Private Sub RegisterControl_Click
(strControlName As String) ‘注册控件
‘Syspath是regsvr32的目录;
strControlName是控件名字(包括路径)
i=Shell(Syspath & “regsvr32.exe /s /I"
& strControlName, vbHide)
End Sub
Private Sub UnRegisterControl_Click
(strControlName As String) ‘撤消注册控件
i=Shell(Syspath & “regsvr32.exe /s /U"
& strControlName, vbHide)
End Sub End Sub



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP