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

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

陈昊芝:腾讯!让我说你什么好? Top Paid与Top Grossing定价策略的差异 Android版百度云推送正式发布 为何开发者应推动公司开源? 从AppGratis被下架说起,苹果或将再次付出代价 58同城的“烦恼”——8K月薪安全工程师引发的入侵 软件开发实践的24条军规 思科 IBM 微软等巨头联合开发开源SDN项目OpenDaylight 巾帼不让须眉:2012年度云计算领域Top 10女性 中移动全力推进NFC 5月起乘公交可刷手机 支持Android与iOS,Qt 5.1 Alpha全新亮相 Google Play:劣质Android应用已无藏身之地! 360推出信用网站认证开放平台 联合百家协会围剿钓鱼网站 经验分享:百度测试架构师眼中的百度QA(一) 在线旅行服务行业开放API带来的新机遇 专访:悬疑恐怖游戏Year Walk美术及音效设计师 解密:微软都柏林数据中心的神秘“免费冷却”装置 云计算如何影响数字化营销? 榜单:十位帮我们打理数据的存储大佬 OpenStack Grizzly版发布 Comcast、CERN成为新会员 谷歌携Blink来势汹汹 WebKit将成明日黄花? 星巴克与苹果合作 顾客可免费下载付费App 微信回应信令争议 将启动2.5G网络优化计划 凤凰网CTO吴华鹏离职 先后供职长达10年 外媒:开发者每周编码时间仅19.1小时 AppGratis CEO现身说法:应用被苹果儆杀始末 一个Web设计师眼里的云计算 戴尔高管:服务器业务领先惠普五年时间 Hoodie:基于JS与CouchDB的超快速Web开发框架 设计优秀API的五大规则 盘点英特尔IDF2013第一天:技术产品新趋势 1000分都给你!谁能列出最好的几本算法与数据结构书,并提供下载地址? 请教一个问题~~~~~~!在线等~! 1000分都给你!谁能列出最好的几本算法与数据结构书,并提供下载地址? 1000分都给你!谁能列出最好的几本算法与数据结构书,并提供下载地址? 请问sql server 2000数据库 的unicode->big5如何转换? 倒分揭露 vc我自建了一个子窗体类,点击主窗体时显示,怎么做啊? 难道我的word文档全都废了吗?? 帮帮忙!一个小问题!呵呵! "自助建站系统"到底能不能实现真正的二级域名、独立域名? 请看看我的代码有什么问题 如何将一个OLE对象转换为位图(注:不要截屏的方式) 在olecontainer里面调出的excel文档,如何使之不可编辑。 急救啊!这个字体怎么设置? 请问在jcreator下能不能编译成exe啊? small_wei进来领分! 初学这样的,觉得是很简单的思路,但找不出错误,有经验的帮忙看看 if a sql syntan can succeed in sql but asp... GDI+的问题 谁有FLASH的注册码,给个,谢谢 怎样用js写一个终止程序,类似asp的response.end 求教:学习MFC文件系统-针对一段代码的3个初学者问题 如何使98一开机就运行屏保!!!急!!!来者有分!帮忙了!!!!! 怪问题 <了解Struts1.1 > 我刚看到的一篇好文章,贴出来,大家共享 dayday up (: 如何驱动8139网卡(笔记本) interbase能与VC结合吗?另外想问有些软件与interbase一起打包安装,如何实现的呢? Lotus——你在哪里? 网络编程中遇到的几个问题(求助) 在java中调用javac.exe 紧急在线等待,求助!!!!! 我是新来的,很多都不懂!也没有朋友,有谁能和我做朋友么? 分手为什么只要一个人说了就算,为什么不能像离婚一样要双方同意,法院判决??? 关于从TImage继承创建自定义控件的问题? JRUN4怎么运行Servlet? 关于远程创建表,删除表的问题?请帮忙。 启动数据库时报 监听程序无法启动专用服务器进程???ORACLE 9.2.0.1.0 如何將指針作為參數傳遞。 请教vb自带的报表编程 在Sql语言中的取整函数是什么? 怎样将添加的记录到所有的现有记录后面? 如何装双系统?(在线等候) CSS一般要学多久才算掌握? 从事共享软件开发的进来谈谈做共享的辛酸好吗? 请教使用notifyicon遇到的问题 ActiveState.Visual.XSLT.for.VS.2003.v1.7.9.2475.WinNT2K无法安装。 如何合并两个dataset win98系统下ISAM问题 如何减小生成的EXE文件大小等? asp.net有没有模板 帮帮忙,呵呵!!!一个小问题!!!!! salary 动物园大亨怎么可以让动物高兴地面都是适合的地面,环境也还好,植物石头都有了,就是一会这个动物不高兴,一会那个,都忙不过来了,怎么办呢样一种动物是要给它很大的空间吗,一般小型地图 关于GenBank提交我按格式写的“>Seq1 [organism=Bjerkandera adusta]B.adusta H10001internal transcribed spacer 1 ,5.8S ribosomal RNA,internal transcribed spacer 2,complete cds”却被提示:“Error:Nucleotide sequence contains invalid char 开展综合实践活动课之前要做哪些方面的准备? postension slab是什么板是在图纸上出现的 tall me how to get 是什么意思 综合实践活动是一门什么样的课程?(定义、性质与特点) air Tall me why翻译成中文是什么意思 1、与传统的学科课程相比,综合实践活动课程有哪些新的特点?开设综合实践活动课程的意义和价值何在? 尘起尘落是什么意思很多都起这个网名 这个网名是什么意思 谁能告诉我 谢谢~ can’t you tall me way?中文意思? 综合实践活动方法指导课是什么意思 形容做事认真刻苦的名言今天就要,不关于学习 The cost of living---.Everyday objects are more expensive.A.rises B.is rising C.has risen D.will rise 下列细胞的膜结构能合成ATP的是( )A 线粒体的外膜 B 叶绿体的类囊体薄膜 C 内质网的膜 D高尔基体的膜 尘满是什么意思 Success became more a function of charm, skills and techniques that lubricate theprocess of human interaction .more a function of是什么意思 体积相等的两个正方体,它的表面积也一定相等. 落落无尘是什么意思 如何判断孩子体内有蛔虫 OVM15-2(1)锚具 是什么意思? 关于做事认真,投入的名言 tall me way 意思tall me OVM15-22什么意思 捕获的近义词和反义词进义词反义词一样一个 call you tall me 不是call而是can 锚具OVM15-2P什么意思? 辛亥革命失败的一面 关于《史记》中的《项羽本纪》的高度概括...注意:不超过100字! ∫[-∞,+∞]e^(-t^2)dt等于多少,求详细解答 基因重组发生在细胞核中吗? 谁死的重于泰山 轻于鸿毛 50个字左右不要战争时的人物! 电工题,为什么du/dt不是等于0 很多都起这个网名 举一个例子说说还有谁的死是重于泰山的,概括写出他的英雄事迹,不少于50字.最好不要写错别字 方便抄嘛,呵呵 谁知道这是什么动物,像猫但它脚好像比猫短,而且身体很臃肿啊.如图猫的脚怎么会这么短啊, 遂起谢绝尘累之念是什么意思 项羽本纪 简略的概括我需要的是青少年版的,不要太多,字数少点哦!我非常急用的! 两只脚的动物都有翅膀吗?今天突然想到这样的一个怪问题,我不内行.拿出来请各位朋友或专家指导一下:陆地上好象两只脚的动物都有翅膀一样.不知是不是这样?是不是这样?不过,我还是不满 忽大风起,尘气莽莽然,城依稀而已.的意思 谁的死重于泰山要简单的事例20字 解释“舟行碧波上,人在画中游.” 英语翻译文章原文:A friend told me this story.He can stretch the truth a bit,so I’m not surewhether to believe him.But on the other hand,truth can be stranger thanfiction!What do you think?Two brothers were watching a horror film on video 诚信是排比 猫猫长翅膀是真的吗 在7点之前,明天就要交了(-ab+2)(ab+2) —(3m-n)(3m+n) (2a²-3b)(-2a²-3b) 先化简,再求值:(a+2)(a-2)减去(a-1)(a+5),其中a=负二分之一 (2x-3y)(-2x-3y) 10又七分之二×9又七分之五 解方程:(2x 关于诚信的排比 elevated permission are required to run 人人网——欢乐动物园:怎样将动物送进动物管理处回收怎样将它送进动物管理回收呢? you tell me什么意思? Are you grassy?are you elevated?是什么意思?是习语吗? 明天要交的 7点之前给我加分!《小石潭记》中以“ ,”这八个字,描写了小石潭溪水的曲折婉转,以“ ”一句暗示了“小石潭”得名的由来.还有《壶口,壶口》的 为什么说倚身于秦晋大峡谷,“ We pass.中文中文的意思 表示看意思的什么尘莫及 what is the total (cost)? 每个人体内都有蛔虫? maintain 这一个关于“Tall Tale”的英语小故事急!8句话就行!就是荒诞,说大话,吹牛的小故事. 正常人体内有多少蛔虫? 白俄总统错坐普京座位 发现后起身让座李娜击败阿扎伦卡 首次跻身WTA总决拉美和加勒比能源部长会议关注能源安全世界经济论坛发布全球性别差异新报告美国财政僵局余波未了日媒:4中国军机同日飞越冲绳 日战斗叙“支持阵线”头目或被打死 政府军战莫斯科时装周力推“俄罗斯制造”日本驻华大使:日中关系不是能够轻易被唐家璇:中日关系深层次原因在于彼此认意大利酒文化展为世博会热身唐家璇:松下35年前预言成现实 中日俄远东南库页岛发生6.2级地震李克强与三国总理会晤解析:中国外交布日本驻华大使:日中关系不是能够轻易被外媒:美国监听35国政要 重创美欧外唐家璇:松下35年前预言成现实 中日唐家璇:中日关系深层次原因在于彼此认第九届北京―东京论坛26日在北京开幕查尔斯不想当国王? 英媒爆王储担心被河南“猪蹄店要账横幅”事件:欠款已全华人游客喜喧哗惹不满 美一中餐馆无奈一艘木船在马来西亚水域倾覆 42人失2014网易未来科技峰会在京举行 “北京市通报当前禁毒形势 利用微信QQ土耳其偏远山村村民为打电话需爬上80西藏千年藏文古籍“菩日文献”将首度向一夫当关万夫莫开--墨西哥门神奥乔亚西藏千年“菩日文献”将首度公开 堪称京东CEO刘强东一线送货 应对618中国西部贫困山区“就地取材”探索建设李克强:文革结束一搞承包制农民温饱问中英经贸关系迎来全面提升的契机联合国呼吁发达国家重视土地荒漠化中国向美军大方亮出“神盾”舰 暗含复河北正定“岸下惨案”见证者:55户被驻衡阳某军械仓库发生爆炸事故 17名深圳警方将重奖举报涉恐线索 可奖50北京当前毒情形势:截止5月底2.5万2013年北京市61人因涉毒犯罪被判汪永清:不断开创政法工作新局面公安部交管局部署夏季交通安全重点工作
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘