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

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),将会把代码的重用发挥得淋漓尽致。您不妨试一试动态加载,也许会产生令您惊喜的效果!

高薪技术排行:大数据居首,苹果相关次之,Java、C等相去甚远 谷歌开发网络跟踪新技术:AdID将取代第三方Cookie 穿在脚上的苹果?苹果聘用Nike设计主管Ben Shaffer 七款Debug工具推荐:iOS开发必备的调试利器 六年亲历,见证中国大数据技术与应用时代的到来 Mailbox:日支撑过亿信息数据库的性能调优及集群迁移 PayPal前CTO 在美国改变世界的乌克兰犹太人 放弃Bootstrap&Foundation,迎接Semantic UI? 一键分享:iOS版Google+发布SDK InMobi杨娟:中国移动游戏如何挑战全球? Adobe再遭APT攻击:数十G源代码及290万用户信息失窃 程序员,如何在工作中崭露头角? 国内外三个不同领域巨头分享的Redis实战经验及使用场景 这是一场潜在的战争:谷歌与Facebook、苹果在搜索上的博弈 设计新闻类网站需要注意的关键点:移动友好、宽带…… 直接开始用:5个免费的在线思维组织工具 招聘开发者常见的九大误区 开源影响销售,维护赞助商? 盘点黑客攻击途径:最常用的7个策略及简单的防护方法 专访AngularJS框架创始人Misko Hevery:让Web开发更便捷 果粉的又一个节日:新iPad或于10月22日发布 新车间李大维:到集装箱里来看创客嘉年华 亚马逊推“登录与支付”功能 直接冲击PayPal Google编程之夏新里程碑:5000万行源代码 8500名学生开发者 非常实用的15款开源PHP类库 Runnable:一站式代码片段服务平台,打造编程界的YouTube 谷歌向所有开发者开放Google App Engine PHP Runtime “沟通”电子表格和矢量图形的“桥梁”:在线可视化工具Raw Facebook北极圈数据中心,Open Compute Project的力作! 最后三天!4折抢购2013移动开发者大会门票 电子书追踪统计,App Annie for eBooks上线 vftable是什么东西? 难道bcb的程序员都要当和尚吗 现在有很多注册表清理工具,请问注册表清理的原理是什么? An Urgent Problem about Word 2000----Is that an mission imposibile ?(s---o---s:high score is warranted) 请看看这个函数... 如何确定线程运行消耗的资源量? 文件系统的树形列表怎么做啊,不要ocx的 为何我使用javascript中location'****.jsp'跳到某一页面,jsp页面不重新编译执行 VC6.0没有声音怎么办 循环20000000次所需要时间(急) 如何使按钮象工具栏上的按钮一样当鼠标移到按钮上时出现文字说明? 关于使用GDI+转换文件格式的问题. 各位能不能介绍点比较经典的算法的书籍,大家分享一下 如何恢复或新建临时表空间????在线等候!!!马上给分! Gis 请教一个数据库的问题,欢迎发言提出解决方案 ??怎样用asp程序把一段html代码转换成纯文本格式? 下拉数据窗口不能下拉是什么原因啊? 有关用VB做数据库的简单问题、ComboBox控件问题! 大家帮我看看这段程序为什么值为0 oracle8.1.7的数据库备份文件怎样恢复到oracle8i上 ? 怎样屏蔽flash的右键菜单,弹出自己的菜单? 我想问一下有没有不写入数据库用ASP代码可以查看当天的浏览访问量 灌水区的水越来越没质量了,你觉得呢? 按钮消息响应的问题,详细请看进去再看 异常详细信息: System.Data.OleDb.OleDbException: 无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开。 求助,网页制作0=={=========>(在线等,送分) 谁能告诉我《C++Builder 5编程实例与技巧》这本书在哪儿可以下载到完整的电子版!高分感谢! 请教如何将一张图片旋转? 关于流媒体和vc++的结合,高人请进!! 关于DataOutputStream和DataInputStream求教 会DirectX的一起来讨论! 4444 菜鸟求助~~~ help me 刚才发现www2.google.com www3.google.com也不能访问了,见鬼:( 我想停止window2000[域控制器]的389端口,但我不知服务是不是LDAP,因为我想占用端口389 各位!帮个忙! 帮忙啊!因为很着急,只有在技术论坛发了,大家原谅 电子地图 上海的程序员都在哪里"混"? 如何最小化所有窗口? 你们有谁读大学一学年要交近1000元书籍费? 帮忙啊!因为很着急,只有在技术论坛发了,大家原谅 asp中如何使用ADO实现对sql数据库操作 求助,网页制作0=={=========>(在线等,送分) 我在用mcisendcommond()函数时,总提示设备类型出错,是什摸原因? 紧急求教高分相送100分。 怎么判断女孩喜欢你? CSDN的首页能登录吗? C 与 C++ 到底有什么不同?? 蘑菇罐头做出来发酸,怎么去除那种酸味?买来的蘑菇罐头都含有柠檬酸,已经在水里浸泡过了,可是做出来菜来还是发酸,不怎么好吃,请问怎么去除这种酸味?谢谢! 大和油墨的镜面银怎么样? 地理小知识:台湾省的素有美称及其含义想到一条算一条,积少成多嘛! 咸肉有点发酸了,怎么样才能去掉酸味呢? 如图,三角形ABC中,角ABC=30°,以BC,AC为边作等边△BCD和等边△ACE,联结BE.求证;AB平方+BC平方=BE平方 台湾岛素有”森林宝库”,”东方甜岛”等美称,含义是什么呢?他们的含义是什么呢?有什么特殊意义?台湾岛还有什么美称呢?(地理用滴:P) 紧急!谁知道各农业地域主导区位因素?注意!是主导区位因素!要求:各种典型的农业地域类型,例如“季风水田农业”“商品谷物农业”“大牧场放牧业”“混合农业”“种植园农业”“水稻 以△ABC的AB,AC为边向三角形外作等边△ABD,△ACE,连结CD,BE相交于点O.①求证:OA平分∠DOE.②点F在DO上,若DF=BO,连AF,求证:△AOF是等边三角形.③求证:OA+OC=OE (1)分析长江中下游地区发展农业的有利条件和不利条件(2)分析新疆发展农业的有利条件及限制性因素 红茶发酵温度怎么控制主要是茶叶加工过程中,发酵室温度湿度的控制范围问题,不是十分的清楚.想请教各专家.什么样的茶叶需要什么样的范围等. 请写出描写四季景物的诗句各一句就是春夏秋冬de诗都一句. 已知函数f(x)+sin(2x+∏/3)求函数最小生周期T,以及用5点法作图 证明欧姆表的中值电阻只决定于E和满偏电流 多电源电路个部分电流如何计算其中 xmm3 中的电流时如何计算得来的 地震来了要怎么办 台湾的主要城市是哪里?台湾最著名的树种是什么? 电路中有两个电源串联,那这个电压应该怎么算呢可以移动位置吗 为什么会地震 免疫系统的基本功能是什么 急需描写四季景物的古诗{和}诗歌,要完整的,不是一句两句.要多 白酒有酸味是怎么回事?我自己在家里酿制白酒,可是这几次的都带有一点酸味.这是什么原因产生的?每次都采用相同的方法,可是只有这一次的酸, 什么是免疫系统?作用是什么? 青岛市的平均降雨强度是多少? 如图,在等边三角形ABC中,点D是AB边上的一点,将三角形BCD绕着点C顺时针旋转后与三角形ACE重合,说明AE∥BC 免疫系统的功能主要有? 高一数学空间几何体一题、在线等!已知正六棱锥的底面边长为3cm,斜高为5cm,求它的体积.(V椎体=1/3S底*h)主要是六棱锥的底面积不会求,请写过程和答案,谢谢帮忙! 为什么打来白酒或醋,可以闻到酒香或酸味? 免疫系统r的主要作用是什么,免疫器官有哪些? 高一数学空间几何体结构题 例4 淋巴因子与神经递质是否处于内环境 设计实验:证明变形虫对外界刺激有反应 如果函数f(x)的定义域为{x|x>0},且f(x)为增函数,f(x•y)=f(x)+f(y)(1)证明:f(x)=f(x)-f(y)(2)已知f(3)=1,且f(a)>f(a-1)+2,求a的值范围 淋巴因子是内环境成分吗 这个有关变形虫细胞核的实验说明了什么用一根玻璃针将一个变形虫切成两半,有核的一半能继续生活,无核的一半死亡.如果将一个变形虫的核取出,无核的部分能短期生存,但不能繁殖后代,单 描写四季景物的诗句 T细胞可以产生淋巴因子么 效应T细胞呢?抗体由哪个细胞产生 吞噬细胞呢 总是分不清 T细胞可以产生淋巴因子么 效应T细胞呢?抗体由哪个细胞产生 吞噬细胞呢 总是分不清 希望详细回答 探索变形虫对刺激的反应(一定要做实验.取三块载玻片,分别在其两端各滴一滴含有变形虫培养液,然后把这两滴培养液联通起来.在载玻片相连一侧(统一在左边)的培养液边缘分别放上食盐 100℃ 98.5%硫酸 用什么材质的管道合适? 淋巴因子作用于抗原发生于内环境这句话是错的, 证明细胞是有机的整体,提供材料:正常生活的变形虫数只,培养皿,培养液.设计实验证明.步骤结果结论 输送酸性介质用什么泵和管道比较好?介质是硫酸溶液.用什么样的泵好一些? 用一根84厘米的木做一个正方体框架,每根短木条多少厘米 台湾哪个城市最大? 什么是镜面银油墨 请大家帮帮忙,解释一下蚂蚁为什么怕酸味?谢谢了,很急很急! 埃及的农业特色是以什么农业为主的 浓度为30克/升 含量在3%左右的硫酸可以用什么材质的管道输送 如图,以三角形ABC的边BC,AC为一边作等边三角形BCD和等边三角形ACE,连接DE.试猜想DE和AB的数量关系并证明. 变形虫和草履虫不具备生命活动的哪个层次 用到镜面银油墨的有哪些产品 如图,三角形abc为等腰三角形,ac=bc,三角形bcd和三角形ace分别为等边三角形,求证g是ab中点.求两种方法 在水溶液中 钠离子 氯离子 硝酸根可以共存吗还有在水溶液中 氢氧根 氢离子 硫酸根能共存吗 发烟硫酸用什么材质的泵和管道输送呢?说明选择的原因 免疫系统的功能是什么? 汤放久了发酸要怎么去除酸味 使用镜面银油墨的注意事项? 变形虫摄取食物的时候,它的细胞发生什么变化~ 面筋发酸如何去除酸味 镜面银油墨哪家好? 太阳能电池单体和太阳能电池片一样吗
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘