activex控件:VB6.0动态加载ActiveXControl控件漫谈

  熟悉VB朋友对使用ActiveXControl控件定不会陌生众多Control控件极大地方便了编程但唯缺陷是不能动态加载Control控件必须在设计时通过引用将Control控件放置在窗体上VB6.0已能够解决该问题只是帮助中没有明确介绍说明并且没有描述到些关键功能由于以前版本中可以动态创建进程外服务:如果对象是外部可创建可在 Set 语句中用 New 关键字、CreateObject 或 GetObject 从部件外面将对象引用赋予变量如果对象是从属对象则需使用高层对象思路方法在 Set 语句中指定个对象引用:  Dim xlApp1 As Excel.Application
Set xlApp1 = New Excel.Application


  或

  Dim xlApp As Object '定义存放引用对象变量 
Set xlApp = CreateObject("excel.application")
xlApp.Visible = True


  这些语法很容易造成误导以为动态加载ActiveXControl控件也是此思路方法可能有朋友也象我样利用CreateObject尝试了无数次却无功而返不知微软公司是出于何种考虑动态加载ActiveXControl控件是扩展Control控件集合方式实现通过实际摸索终于就如何实现动态ActiveXControl控件找出了条切实可行思路方法下面以个具体例子来详细介绍说明

  、ActiveXControl控件

  ActiveX Control控件是 Visual Basic 工具箱扩充部分使用 ActiveX Control控件思路方法和使用其它标准内装Control控件如 CheckBox Control控件完全中加入 ActiveX Control控件后它将成为开发和运行环境部分并为应用提供新功能

  ActiveX 部件通过客户端/服务器关系和应用— 及和部件相互的间— 交互作用客户端是使用部件功能应用代码或部件服务器是部件及其关联对象例如假设应用使用 ActiveX Control控件来提供个标准雇员窗体供公司多种应用使用提供雇员窗体 ActiveX Control控件就是服务器使用这个Control控件应用就是服务器客户端

   2、加载思路方法

  VB6.0中对Controls 集合进行了扩展以前版本中Controls 集合在窗体上列举出已加载Control控件这在迭代过程中是很有用Controls 集合标识个叫做 Controls 内在窗体级变量如果忽略可选 object 所在处整数则关键字 Controls 必须包括在内我们通常在窗口中使用如下代码:

  Text1.Text="Hello, world"

  其实也可以使用如下代码达到同:

  Controls(1).Text="Hello, world"

  在VB6.0中除了原来Clear、Remove 思路方法外(很奇怪为什么微软在VB5.0中只提供这两种思路方法而没有提供Add思路方法没有Add这两种思路方法也就没什么用处)增加了Add思路方法该思路方法就是用于动态加载Control控件:

  Controls.Add(progid as String, Name as String);

  progid: ActiveX部件ProgID如:"VB.CheckBox";

  Name:ActiveX部件加载后名称如: "MyCheckBox";

  若要在窗体上添加个名为MyButton按钮可以使用:

  dim oControl as Object '窗体级变量

  注意:这里声明为Object对象类型

  Private Sub LoadControl
Set oControl = Controls.Add
("VB.CommandButton", "MyButton")
   oControl.Left = 10
   oControl.Top = 10
   oControl.Visible = True '使Control控件可见
End Sub


  这是VB6.0标准语法它在例程中也是如此演示不过该思路方法虽然现实了Control控件动态加载按钮显示在窗体上可以象普通按钮样按下去但加载Control控件不能预先设计响应事件代码如:事件Sub MyButton_Click将是非法当然可以将要响应事件封装在Control控件内部就编程观点来看该思路方法没什么大用处开发ActiveXControl控件是为了资源共享为了被其他开发人员利用所以要提供必要事件接口显然利用该思路方法不行通过分析VBControls等相关对象找出VBControlExtender对象和EventInfo相结合能提供事件陷井捕捉VBControlExtender对象对动态添加Control控件特别有用它提供了套通用属性、思路方法、事件给开发人员个突出特点是能编程设计Control控件事件熟习类编程朋友对带事件对象声明定不会陌生:

  Dim WithEvents objElemt as CElemtVBControlExtender也不例外声明语法只不过它有个特殊事件ObjectEvent(Info As EventInfo)它能捕捉到对象使用RaiseEvent产生所有事件EventInfo数据结构映射了事件名称、参数个数和参数VBControlExtender和 EventInfo相结合采用Select Case 就可以预先将区别类对象事件放置各自独立运作将上面代码改写下就能提供Click事件了:

  Dim WithEvents oControl As VBControlExtender '带事件声明声明的后您就可以在代码窗口左上角对象下拉框中发现该对象出现了也就是说该对象有了事件或思路方法了事件有DragDropDragOver LostFocus GotFocus ObjectEvent和Validate其中ObjectEvent是通用事件捕捉

  Private Sub LoadControl
  Set oControl = Controls.Add
("VB. CommandButton", "MyButton")
  oControl.Visible = True
End Sub
Private Sub oControl_ObjectEvent(Info As EventInfo)
  Select Case Info.Name
  Case "Click" 'Click事件
 '您可以添加处理Click事件代码
 MsgBox "您按了MyButton!"
  Case Else ' 其他事件
    ' Handle unknown events here.
  End Select
End Sub


  当然对微软提供标准Control控件能采用该思路方法添加大家都不会怀疑但自己开发Control控件也能吗?答案是肯定我们可以用个实际例子进行介绍说明

   3、例子描述

  假设个本地网络监控系统需要在原理图和实物示意图间切换原理图包括组网结构、传输资源、监控主机等而实物示意图包括路由器、设备、采集器等当然两种图事件要如双击某个设备图形将显示给设备实时数据等为了简化维护将原理图和实物示意图封装成ActiveXControl控件由于每种图需要加载许多图形Control控件消耗资源较大不能同时加载需要将其分解为两个Control控件在切换时首先卸载个Control控件然后加载另个Control控件所以要实现动态加载ActiveXControl控件

  原理图Control控件为--Theory.ocx 对应工程为CTheory;

  实物图Control控件为---Fact.ocx 对应工程为CFact;

  注意:为了简化在设计Control控件时不设置许可证关键字

  实物图Control控件上图形对象可以被拖动拖动后位置信息通过事件ChangePosition来通知拥有该Control控件窗体以便下次加载能显示在最后位置实物图和原理图Control控件都有双击事件完成工作相同其他事件此处忽略

   4、具体举例

  1、准备工作

  对Control控件Theory.ocx 、Fact.ocx 进行注册(利用Regsvr32.exe注册);

  建立窗体frmTest.frm 在窗体上放置按钮cmdLoadOcx—“原理图”

  2、声明窗体级变量和加载LoadControl

  Dim WithEvents oControl As VBControlExtender  
'地图仿真Control控件对象
Dim mblnTheory As Boolean  '是否显示原理图
Private Function LoadControl(Type As Integer)
If Not oControl Is Nothing Then 
'首先判断对象是否存在若存在则卸载
 Controls.Remove("MapView") 
'卸载Control控件此操作非常重要
End If
If Type = 0 Then
Set oControl = Controls.Add
("CTheory. Theory", "MapView")
Else
Set oControl = Controls.Add
("CFact.Fact", "MapView")
End If
oControl.Height = 3500
oControl.Width = 6500
oControl.Top = 100
oControl.Visible = True
End Function
Private Sub Form_Load
mblnTheory = True
End Sub


  3、为按钮cmdLoadOcx编写代码

  Private Sub cmdLoadOCX_Click
If mblnTheory Then
   Call LoadControl(0)
   mblnTheory = False
   cmdLoadOCX.Caption = "实物图"
Else
   Call LoadControl(1)
   mblnTheory = True
   cmdLoadOCX.Caption = "原理图"
End If
End Sub


  4、为事件ChangePosition编写代码

  Private Sub oControl_ObjectEvent
(Info As EventInfo)
  Select Case Info.Name
  Case "ChangePosition"
    MsgBox CStr(Info.EventParamters.Item(
1).Value) + ":" + _  
  CStr(Info.EventParamters.Item(2).Value)
  Case "DbClick"
 '双击处理代码
  Case Else '
  End Select
End Sub


  注意: EventInfo参数EventParamters集合中是以1开始般来说微软新集合般是以1开始而旧是以0开始如RdoErrors.Item(0)

  5、关闭窗口前卸载Control控件

  Private Sub Form_Unload(Cancel As Integer)
Controls.Remove("MapView")
Set oControl = Nothing
End Sub


  6、特别注意

  通过Controls.Add思路方法添加ActiveXControl控件定不能在该工程中有该Control控件任何引用否则系统将出错

   5、小结

  通过使用动态加载ActiveXControl控件使用庞大应用变得很小将区别ActiveXControl控件进行各种组合使应用更加灵活多变如您应用系统要处理 3十种门禁而某个具体用户可能只有种或两种门禁根本没必要首先将所有门禁包含到应用中可将各个门禁独立封装只安装注册需要组件就象Windows自定义安装微软未来技术基础是分布式组件技术(DCOM)将会把代码重用发挥得淋漓尽致您不妨试试动态加载也许会产生令您惊喜效果!

Tags:  ieactivex控件 activex控件和插件 安装activex控件 activex控件

延伸阅读

最新评论

发表评论