免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习资料收集于网络,仅供参考熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语句中用 New 关键字、CreateObject 或 GetObject 从部件外面将对象引用赋予变量。如果对象是从属对象,则需使用高层对象的方法,在 Set 语句中指定一个对象引用: Dim xlApp1 As Excel.ApplicationSet xlApp1 = New Excel.Application或Dim xlApp As Object 定义存放引用对象的变量。 Set xlApp = CreateObject(excel.application)xlApp.Visible = True这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋友也象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种考虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如何实现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说明。 一、ActiveX控件 ActiveX 控件是 Visual Basic 工具箱的扩充部分。使用 ActiveX 控件的方法与使用其它标准内装的控件,如 CheckBox 控件,完全一样。在程序中加入 ActiveX 控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。 ActiveX 部件通过客户端/服务器关系与应用程序 及与部件相互之间 交互作用。客户端是使用部件功能的应用程序代码或部件。服务器是部件及其关联的对象。例如,假设应用程序使用 ActiveX 控件来提供一个标准的雇员窗体,供公司的多种应用程序使用。提供雇员窗体的 ActiveX 控件就是服务器,使用这个控件的应用程序就是服务器的客户端。 二、加载方法 VB6.0 中对Controls 集合进行了扩展,以前版本中Controls 集合在窗体上列举出已加载的控件,这在迭代过程中是很有用的。Controls 集合标识一个叫做 Controls 的内在窗体级变量。如果忽略可选的 object 所在处的整数,则关键字 Controls 必须包括在内。我们通常在窗口中使用如下代码: Text1.Text=Hello, world其实也可以使用如下代码达到同一目的:Controls(1).Text=Hello, world在VB6.0中除了原来的Clear、Remove 方法外(很奇怪,为什么微软在VB5.0中只提供这两种方法,而没有提供Add方法,因为没有Add,这两种方法也就没什么用处),增加了Add方法,该方法就是用于动态加载控件的: 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 使控件可见End Sub这是VB6.0的标准语法,它在例程中也是如此演示的,不过该方法虽然现实了控件的动态加载,按钮显示在窗体上,可以象普通按钮一样按下去,但加载的控件不能预先设计响应事件代码,如:事件Sub MyButton_Click()将是非法的,当然,可以将要响应的事件封装在控件内部。就编程的观点来看该方法没什么大的用处,开发ActiveX控件的目的是为了资源共享,为了被其他开发人员利用,所以要提供必要的事件接口,显然利用该方法不行,通过分析 VBControls等相关对象,找出VBControlExtender对象与EventInfo相结合能提供事件陷井捕捉, VBControlExtender对象对动态添加控件特别有用,它提供了一套通用的属性、方法、事件给开发人员,它的一个突出特点是能编程设计控件的事件,熟习类编程的朋友对带事件的对象声明一定不会陌生: Dim WithEvents objElemt as CElemtVBControlExtender 也不例外,声明的语法一样,只不过它有个特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到对象使用 RaiseEvent产生的所有事件,EventInfo数据结构映射了事件的名称、参数个数和参数的值。VBControlExtender和 EventInfo相结合,采用Select Case 就可以预先将不同类对象的事件放置一起,各自独立运作。将上面的代码改写一下就能提供 Click事件了: Dim WithEvents oControl As VBControlExtender 带事件声明声明之后您就可以在代码窗口的左上角的对象下拉框中发现该对象出现了,也就是说,该对象有了事件或方法了,它的事件有DragDrop,DragOver , LostFocus ,GotFocus ,ObjectEvent和Validate,其中ObjectEvent是通用的事件捕捉。 Private Sub LoadControl() Set oControl = Controls.Add(VB. CommandButton, MyButton) oControl.Visible = True End SubPrivate Sub oControl_ObjectEvent(Info As EventInfo) Select Case Info.Name Case Click Click事件您可以添加处理Click事件代码MsgBox 您按了MyButton! Case Else 其他事件 Handle unknown events here. End SelectEnd Sub当然对微软提供的标准控件能采用该方法添加,大家都不会怀疑,但自己开发的控件也能吗?答案是肯定的,我们可以用一个实际的例子进行说明。 三、实例描述 假设一个本地网络的监控系统,需要在原理图与实物示意图间切换,原理图包括组网结构、传输资源、监控主机等,而实物示意图包括路由器、设备、采集器等,当然两种图的事件要一致,如双击某个设备图形将显示给设备的实时数据等,为了简化维护,将原理图与实物示意图封装成ActiveX控件,由于每种图需要加载许多图形控件,消耗资源较大,不能同时加载,需要将其分解为两个控件,在切换时首先卸载一个控件,然后加载另一个控件,所以要实现动态加载ActiveX控件。 原理图控件为-Theory.ocx ,对应工程为CTheory; 实物图控件为-Fact.ocx ,对应工程为CFact; 注意:为了简化,在设计控件时不设置许可证关键字。 实物图控件上的图形对象可以被拖动,拖动后的位置信息通过事件ChangePosition来通知拥有该控件的窗体,以便下次加载能显示在最后位置,实物图和原理图控件都有双击事件完成的工作相同,其他事件此处忽略。 四、具体示例 1、准备工作 对控件Theory.ocx 、Fact.ocx 进行注册(利用Regsvr32.exe注册); 建立窗体frmTest.frm ,在窗体上放置按钮cmdLoadOcx“原理图” 2、声明窗体级变量与加载函数LoadControl Dim WithEvents oControl As VBControlExtender地图仿真控件对象Dim mblnTheory As Boolean 是否显示原理图Private Function LoadControl(intType As Integer)If Not oControl Is Nothing Then 首先判断对象是否存在,若存在则卸载Controls.Remove(MapView) 卸载控件,此操作非常重要End IfIf intType = 0 ThenSet oControl = Controls.Add(CTheory. Theory, MapView)ElseSet oControl = Controls.Add(CFact.Fact, MapView)End IfoControl.Height = 3500oControl.Width = 6500oControl.Top = 100oControl.Visible = TrueEnd FunctionPrivate Sub Form_Load()mblnTheory = TrueEnd Sub3、为按钮cmdLoadOcx编写代码 Private Sub cmdLoadOCX_Click()If mblnTheory Then Call LoadControl(0) mblnTheory = False cmdLoadOCX.Caption = 实物图Else Call LoadControl(1) mblnTheory = True cmdLoadOCX.Caption = 原理图End IfEnd Sub4、为事件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 SelectEnd Sub注意: EventInfo的参数EventParamters集合中是以1开始的,一般来说,微软新的集合一般是以1开始的,而旧的是以0开始的,如RdoErrors.Item(0)。 5、关闭窗口前卸载控件 Private Sub Form_Unload(Cancel As Integer)Controls.Remove(MapView)Set oControl = NothingEnd Sub6、特别注意 通过Controls.Add方法添加的ActiveX控件一定不能在该工程中有该控件的任何引用,否则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钻石买卖合同(裸钻)
- 医疗影像师劳动合同
- 网上税务办理创新创业项目商业计划书
- 糕点切片机械行业跨境出海项目商业计划书
- 艺术品市场与展览研究创新创业项目商业计划书
- 精密金属切割材料行业跨境出海项目商业计划书
- 美容产品包装设计大赛企业制定与实施新质生产力项目商业计划书
- 企业隐患整改验收管理办法
- 英语不定代词用法学习资料
- 物流运输成本分析报告模板
- 2025年甘肃省庆阳市公安局面向社会招聘警务辅助人员58人考试参考试题及答案解析
- 2025江苏宿迁泗阳县部分县属国有企业招聘劳务派遣人员考试参考试题及答案解析
- 山东省名校考试联盟2026届高三上学期10月阶段性检测物理试卷(含答案)
- 服务器健康巡检规定
- 第16课奇石课件
- 危化品安全管理条例
- 2025年内蒙古交通集团笔试考试试题
- 2025年初中道德与法治八年级上学期期中测试试卷
- 低压抢修安全培训课件
- 铁路礼仪培训课件
- 辉瑞生物医药研发管线2025年战略布局前瞻分析报告
评论
0/150
提交评论