说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB6.0动态加载ActiveX控件漫谈-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
VB6.0动态加载ActiveX控件漫谈-Delphi资料

熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。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

这些语法很容易造成误导,以为动态加载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 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

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

三、实例描述

假设一个本地网络的监控系统,需要在原理图与实物示意图间切换,原理图包括组网结构、传输资源、监控主机等,而实物示意图包括路由器、设备、采集器等,当然两种图的事件要一致,如双击某个设备图形将显示给设备的实时数据等,为了简化维护,将原理图与实物示意图封装成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 If

If intType = 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、关闭窗口前卸载控件

Private Sub Form_Unload(Cancel As Integer)

Controls.Remove("MapView")

Set oControl = Nothing

End Sub

6、特别注意

通过Controls.Add方法添加的ActiveX控件一定不能在该工程中有该控件的任何引用,否则系统将出错。

五、小结

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

回顾HTML5这一年:在痛并快乐中前进 学Apple,微软宣布2013上半年零售店建设计划 真羡慕他们:谷歌宣布Gmail电话明年继续免费 c#经典入门视频004变量-苏坤老师主讲 c#经典入门视频005变量的使用和命名规则-苏坤老师主讲 c#经典入门视频006输出变量的值(及赋值符、连接符、占位符)-苏坤老师主讲 c#经典入门视频007变量交换_输入-苏坤老师主讲 回首JavaScript这一年:笑里藏刀 百媚丛生 平板优先:Supercell游戏公司日收入100万美元 Mootools实现具有排版功能的页面拖拽 2012:云计算的春天 直击Strata+Hadoop World:百万雄师过大江 能携带的网络 Anyfi 150万建网络虚拟热点 又将颠覆产业?传苹果正开发蓝牙智能手表 JavaScript社区开发者调查结果 欢乐淘、求PS大神获腾讯开放平台应用创新大赛年度金奖 2012是响应式设计之年 12月28日:1903年计算机之父冯·诺依曼出生 Android木马病毒:伪装成Google Play图标进行DDoS攻击 IE10 CSS Hack 程序员技术分享:训练机器学习 SVM算法解析 2013,谷歌的数据科学家都将干什么呢? Facebook“也”对服务器进行浸泡冷却 日本最大电脑商:Windows 8表现并不好 日均新增415个应用,Windows 8应用总数突破35000 百度推出图像搜索引擎“百度识图” 可基于图像实现全网人脸搜索 解决专利纠纷 RIM向诺基亚预付6500万 巨头的得意与失落:2012移动游戏十大收购案 Mozilla或许将发布iOS平台浏览器Junior Mozilla:Facebook手机将采用Firefox OS Anonymous2013年将放慢脚步,McAfee预测遭质疑 请问CSDN很多以前的粘子以及我的收藏夹里的粘子为什么不能显示?? zmcpu(CPU),谢谢你的回答,接分 !如何使VB的程序,自己生成 .exe 文件???有难度吧~!高手!!!求助!(visualbasic2000) 谁知道哪里有Base64的文档,分不够在加 PeekMessage 和 GetMessage, SendMessage 和 PostMessage 有什么区别? 求新闻发布管理系统(jsp) 水晶报表的统计的问题 如何解决Data Field not permitted to open Dataset! 今天和喜欢的MM调到同一个办公室,加上终于又长了三只脚,高兴,散分! 如何在XP下实现自杀 informix 日期 请告诉我一个完全可以用的ASP上传文件组件!!!急用! 小弟做一个程序!怎样用代码实现access数据库的导入!和怎样把sql语句选择出来的数据导出到access!在线等! 想当鼠标在某一个label上时,这个label就变色。请问,怎么能够最简单的实现这个功能(需要高手)? 有人认识小反吗?告诉她我在找她。 高分请教,如何用JAVA实现浏览局域网里的其他机子的目录。在线等待 winsock可否在internet下传输文件 简单问题,恢复有分!!! 界面问题——buider做出来的界面太普通了 简单问题,回复有分!!! 第一次放这么多的分>>>>>>>>>>请进来看看(一周以内结帖) (6)今夜狂放1000分,100分只给前3个,第一个来报到的50分,第二个30分,第三个20分:)需要分的来吧:)前500分已经放出。。 简单问题,回复有分!!! 100分紧急求救:因在asp网页中需用www.myweb.com.cn/ok.asp url,我的win2k server该怎样配置? 大家好,我现在正做俄罗斯方块,大家能跟我说他的基本思想吗? 我想这是大家都想要的东西? 简单问题,回复有分!!! web server是不是就是用php等语言写后台程序? 页面间参数传递的问题!(结贴率100%) tocamt服务的自动启动和手工启动有何区别? 请教:金山词霸的屏幕取词用的是什么技术。是怎么实现的 用Delphi的朋友,公布我们的MSN帐号,大家互相学习好吗? 哪里有weblogic6.1 sp4 下载!!! window.print怎样才能不在页底打印页面的标题地址信息? 我的显示器怎么会有重影?? 请问如何用jsp实现如vb中的SSTab控件那样的效果? 有没有消息分数线什么时候出来啊??? 源码大放送2(注:适合新手以及和我一样懒的人!! ~v~) UTF-8?将字符转成UTF-8用PHP如何做??急? 类似matlab中simulink的界面如何实现?散分 关于分页显示的问题 截获getprocaddress遇到的问题. 請各位幫幫忙,關於剛開始安裝的問題: sql 查询? 怎样判断程序是否在运行,如果运行怎样关闭他呢? POP3邮件接收问题!!! 几个月来一直未解决的小BUG(多文档的标题) PB中怎么样定义游标变量 本人欲求计算机画图中的橡皮筋技术画线例程,请大家指教并加相关注释,先帖出代码都得分. 只为试一下新下的放分机,10钟后结贴 急急急!!!!!!!!!如何用ADO连接Sybase数据库? 这是广告,不知道是不是真的,没兴趣不要看啊 “C罗女友”伊莉娜·莎伊克性感拍摄最盘点荧屏新生力量 美艳90后女星央视美女球迷是兼职模特 海量私房照曝揭秘女星嫁入豪门前后天差地别的境遇李小璐佟丽娅 盘点看似惊艳却最不耐看董洁张柏芝小S 盘点迷死人的少妇女星刘诗诗陈乔恩杨幂 女星或惊艳或惊雷的登央视美女球迷是兼职模特 一夜爆红私明星童年照与儿女比美 赵薇与小四月神陈德容萧蔷张庭 台湾8点档偶像女星今史上最全揭秘韩国女星整容真相 令人幻盘点一直被模仿从未被超越的经典银幕形长江后浪推前浪 昔日惊鸿一瞥漂亮女星白俄罗斯美女是国宝被禁止出国 网友惊北体校花童苡萱酷似柳岩 成新一代宅男郑爽整容前后对比照曝光 揭秘疑似整容“乳神”柳岩爱上内衣外穿 露胸比露腿苍井空中国捞金穿旗袍 盘点美女明星旗孙俪杨幂刘诗诗 80后女性跻身一线大林青霞王祖贤 盘点可望而不可及的超清霍思燕被曝“未婚先孕”领衔孕妇时尚穿这些美容 孕期绝对不能做复色兰花首次亮相 解放公园兰展三栋房产隐藏的民国范儿民国·武汉·房子武汉卓尔新赛季票价 最低仅20春季肌肤养护 从保湿水新品开始法官:是否属共同财产要看结婚时间琴台大剧院演出资讯消防员救出被困司机中百跃升冷链物流概念股时间:2月22日 24日招领胡同“马上入伙”VIP定制提分三大招油改概念股演绎牛市风采憧憬新岁 不负光阴武汉玩家打开微信 可以点菜了小夫妻春节遭遇“催二胎”SEPHORA推出77款单色眼影一周母婴热点一看分数傻了眼 外语考了59.9分
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘