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

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

我们是如何阅读代码的? “热水冷却”技术将主导美国国防部数据中心改造 程序员想玩转大数据:需要知晓的12种工具 2012年谷歌应用商店增长迅速 但苹果最赚钱 Apple微软Google都在竞购一家创业公司 违反新条款?苹果强行下架AppShopper 2012移动开发教程盘点:最棒的国外游戏开发站 重思JavaScript的好与坏 细数那些 NeXT 留给 OS X 的遗产 一张图让你知道大数据的生态系统 Camera360开放SDK:拍照和滤镜一行代码搞定 一周消息树:计算机将拥有五感 人类面临威胁? 通晓数学的人就可以当程序员吗? 360发布企业版4.0 可自定义软件白名单 不要总是依赖机器 MongoDB扩展彰显分片功夫 Dell与HP的OpenStack的战略:渠道对抗SLA 路况电台王雷:未来车载系统会是Android的天下 移动周报:2012移动开发工具系列盘点 谷歌不愿错失机会 Android或不再成它人独享 黑客文化:Facebook公布2012年Hackathon大赛顶级“黑客作品” 中国移动音乐开放平台正式对外开放 GitLab 4.0发布 更好地支持PostgreSQL 傻瓜式移动应用开发平台:专访摩讯创始人赵健 日本DeNA进军中国智能电视,与海信战略合作 扎克伯格不仅为Poke编码,而且还“献声” Wordament:首款支持Xbox Live成就的iPhone游戏 使用Storm实现实时大数据分析! 孙博凯:微软日益开放,Windows Azure更加拥抱开源 大数据计算:如何仅用1.5KB内存计算十亿个不同的对象 我们为什么爱EC2和S3却彻底抛弃EBS 不畏Surface:诺基亚明年或推Windows平板 在ASP中确定当前用户帐户用何办法? 我以前问过的问题,但是没有解决?现在100分买?谁能解决???? fastreport的中文帮助,或者例子? edit的问题,up有分 用adoquery建立的查询在执行时出错! 还有一个问题 业务纪录的自动编号!!! 请问各位大侠."查找",这个函数怎么写. Proc++ :where LPAD(FieldName,6,'0') = :myFieldValue 为啥错? 用OPENGL编制基于对话框的程序要求把所绘的三维图形显示在对话框的一个区域??? 谁知道用socket通信,一秒鈡最多可以传多少条? 我要是想把已有SQL数据库变成*.SQL文件到别的机器上直接建库怎么做? 我用标准输入输出流来输入字符串到string的对象里,为什么得不到空格和以后的字符? 转一篇文章——有关LSD的罐头 (有点长,没耐心的就不用看了^o^) 送分! 超过10个回复请勿再进!!! VC程序调试问题 懂电路分析者请进 求树型菜单的代码??马上给分!!! VC可以调试可执行文件吗??? 请高手指点迷津 :) 求树型菜单的代码?? 如何使列表控件的第一列居中(包括标题文本和内容文本)??? 用查表法按ALPHA混合R、G、B也会这么慢?奇怪!(有源码)(50 怎样用vc开发一个动态链接库让PB调用,要求参数为字符串 3dmax 的问题 关于用alert("信息!")弹出的对话框 up up up up up up up up up up up up up 请问“IE登录时”为什么Domino检测不到我的Username and password? 着急,这条sql语句怎么写?????? 爱的密码 散分啰!!统计BCB论坛现有成员... 这样的COM组件如何实现? 请教:我想学lotus,可不知哪有lotus和lotus教程下载,望指教! 多选项提交过来的值是什么类型的? ORA-03113: end-of-file on communication channel谁知道??高手救命! 星际争霸几大战略(大家切磋切磋) CHtmlView的刷新问题 关于asp.net加密的讨论 怎么样把两个ArrayList合并成一个??我在文档里找了半天也没找到!急~~!!!!!!!! 》》》菜鸟发问:SQL SERVER2000 可以对 office 文档进行全文检索吗? How to alter DBGrid Scrollheader Color? c怎样访问数据库啊?一定给分! from里的参数传递为ENCTYPE="multipart/form-data"时的问题? 网吧问题 如何在txt文件中查找字符 请问如何实现当进入一个combox时自动下拉列表框(不用用鼠标去点) 关于volatile 修饰词 过去用Delphi开发数据库都是用Access,现在急需使用SQL Server。请问:我必须掌握SQL Server中的那些内容。 如果我想删除日志文件的所有记录该怎么办?????? 怎么样把两个ArrayList合并成一个??我在文档里找了半天也没找到!急~~!!!!!!! 请问,NT4.0下怎样配置网关和路由? 请问如何知道一个弹出菜单是否以经关闭 一个三角形面积是十八平方米它等底等高的平行四边形的面积是多少 要想使塑料化工桶增加强度怎么生产我生产的是50公斤白塑料桶 一个圆形草坪的半径是40米,草苹的周围修有一条10米宽的水泥马路,这条马路的面积 夏天给自行车的轮胎打气时,为什么不能打得太足?从分子角度讲要从分子角度说明! 化工桶上的CN号是什么意思那能不能根据上面的编号查处是那种物品,换句话说是不是一个编号一种料 水果店里苹果比梨少60千克,苹果卖出一半后,比梨少100千克,水果店原有苹果和梨各多少千克? 用分子的知识回答:自行车轮胎打气后涨大变硬 图为正方形园子一角,正方形的边长为x,里面有两个半圆形花池,阴影部分是草坪,求草坪的面积.________. 一个长方体长30厘米,宽20厘米,里面装有10厘米深的水,现在有一块长和宽都是8厘米,高是15厘米的长方体石块.,《1.》如把石料横着放入水中,水面上升多少厘米,《2》如果把石料竖着放人容器里, 轮胎充气有什么用呢?自行车的轮胎如果不充气会怎么样,为什么要充气? 如图,阴影部分表示校园的草坪,空白部分表示小路,计算草坪的面积.长为a,宽为b,小路宽为x. 水果店运来一批红富士苹果,准备分甲,乙两个等级卖,甲等级的每千克8元,乙等级的每千克6元,这样卖出这批苹果共得580元,如果每千克苹果都降价1.5元,这批苹果只能卖460元,问甲,乙两个等级的 水果市场运来苹果6000千克卖出百分之20卖出多少千克还剩多少千克 某小区有一块边长8米的正方形空地,下面是小明设计的绿化方案平面图,空白部分为花坛,阴影部分为草坪.1.要在花坛四周围上篱笆,篱笆的长是多少米.2.计算花坛的面积是多少平方米? 水果店运来一批红富士苹果,准备分甲,乙两个等级卖,(只能设一个X)水果店运来一批红富士苹果,准备分甲,乙两个等级卖,甲等级的每千克8元,乙等级的每千克6元,这样卖出这批苹果共得580元, 一个三角形的面积比与它等底等高的平行四边形的面积少43平方米,求这个平行四边形的面积是(). 阴影的部分是草坪空白部分是花圃,求草坪的面积 水果店运来苹果,分甲乙俩个等级卖,甲等级8元,乙等级6元,这样苹果卖出580,甲乙等级 油罐车放油如何少给 某公园欲建如图所示的草坪(阴影部分)需要铺设草坪多少平方米?若每平方米草坪需120某公园欲建如图所示的草坪(阴影部分)需要铺设草坪多少平方米?若每平方米草坪需120元,则修建该草坪 一个长方体玻璃容器,长8厘米,宽5厘米,高6厘米,在这个容器中倒入160毫升的水,再把一个铁块放入水中(铁皮被水完全侵没时,溢出水28毫升)这个铁块的体积是多少立方厘米? 装油的油罐车的尾部总装有一根脱在地上的铁链,这是为啥?HELPTHANKS 如图为园子一角,正方形边长为x,里面有两个半圆形花坛,阴影部分是草坪,求才草坪的面积是多少?他是多项它的次数是多少?图是一个正方形,正方形里面有两个半圆,半圆的大口一个朝左,一个朝 将内径为30cm,高为hcom的圆柱形水桶装满水,倒入一个长方体的水箱中,水只占水箱容积的四分之一,则水箱则水箱的容积是( )立方厘米。(内径指圆柱的底面直径) 一个三角形的面积是80平方分米,它的底是16米,高是多少米?(用方程解答) 有一个长50厘米,宽30厘米的长方体水箱,放入一个长和宽都是10厘米的铁块,水面上升了1厘米,求铁块的高 水果店有苹果240千克,苹果比梨少1/5,梨有多少千克 一块三角形草地,底边长是150米,底边和高的比是6:5,这块三角形草地的面积是多少平方米? 王大伯开了一间水果店他到苹果产地进货每千克1.2元一次他到产地买了5000千克苹果光运费就200元他还想得到百分之二十的利润每千克定价多少元 如图所示,分别在三角形,四边形,五边形的广场各角修建半径为1米得扇形草坪分别在三角形,四边形,五边形的广场各角修建半径为1米得扇形草坪图1草坪面积为( )用π表示图2草坪面积为( ) 一块三角形地,底边长150米,底边和高的比是6:5,这个三角形面积多少平方米? 王大伯开了一个水果店,他到苹果的产地进货,每千克1.20元.一次他到产地买了5000千克的苹果,光运费就用了200元,他还想得到20%的利润,每千克应定价多少元? 如图所示,分别在三角形、四边形、五边形的广场各角修建半径为R的扇形草坪(1)图1中草坪的面积为 (2)图2中草坪的面积为 (3)图3中草坪的面积为 (4)如果多边形边数为n,其余条件不 已知三角形三边长分别为4,5,6,求这个三角形的面积我现在初二,别这弦那弦的 一油罐车有多少吨 如图所示,分别在三角形,四边形,五边形,六边形的广场各角修建半径为R的扇形草坪,如图所示,分别在三角形,四边形,五边形,六边形的广场各角修建半径为R的扇形草坪(图中阴影部分) (1)图1中 一个三角形的底边长6米,如果底边延长2米,那么面积就增加3米.原来三角形的面积是多少平方米? 5吨油罐车哪个好 如图所示,要在三角形广场ABC的三个角处各建一个半径相同的草坪,要求扇形的半径为20M,求草坪的总面积.(π取3. 一个三角形的面积是360平方分米,底是30分米,高是多少分米? 梦到油罐车爆炸梦见亲眼看见油罐车泄漏,起火,然后拨打了110,然后听到爆炸,死了好多人 如图所示,分别在三角形,四边形,五边行,的广场各角修建半径为r的扇形草坪. 油库、面粉厂、锯木厂、纺织厂、矿井、煤气站等地为什么要严禁烟火如题 北京房山油罐车爆炸了,油罐车为什么会爆炸?3Q北京房山油罐车爆炸了.请问,有什么危险因素会导致这种油罐车爆炸吗? 在一个长、宽、高分别为30厘米,60厘米,80厘米的长方体水箱中,不计厚度有A、B两个进水管,先打开A管,经过一段时间后打开B管,两管同时进水.下面折线图表示进水情况,请根据图回答问题.(A、B 油库附近严禁烟火是由于( )A.分子之间有间隙B.汽油分子在不断地运动C.同种分子的性质相同C.汽油分子非常小 油罐车爆炸影响会污染吗 一个无盖的长方体水箱的底面长80厘米,宽是50厘米,高是60厘米.这个水箱能装水多少升? 为什么面粉厂和加油站一样,也高挂“严禁烟火”的警示牌?用化学知识回答 一个三角形的面积是12平方厘米,它的高是5分之12厘米,这个三角形的底是多少?求你们了,十分钟啊 在一个长、宽、高分别为30厘米,60厘米,80厘米的长方体水箱中,(不计厚度)有A、B两个进水管,先打开A管,经过一段时间后打开B管,两管同时进水.下面折线图表示进水情况,请根据图回答问题.(A、 一个农民运来一批西瓜,进价为每千克2元,卖出每千克3元,每天能卖出200千克,每千克降价0.1元,每天可多出售40千克.另外,每天的房租等固定成本共24元.该农民每天赚200元,尖将每千克西瓜的售价 油罐车的立方怎么算如题 谢谢了请问下,现在油罐车都是椭圆形的,那它的立方怎么算呀! 做一个无盖的长方体铁皮水箱,长80厘米,宽60厘米,高40厘米,做这个水箱一共用铁皮多少平方米? 油库重地 严禁烟火用阿拉伯语怎么说 家用的塑料盆桶碗,是什么原料制作而成的? 在一个长方形大草坪上修建两个同样大小的圆形花坛,使这两个花坛的面积的和是余下草坪面积的一半,已知草坪的长是40m,宽是30m,求花坛的半径. 一个三角形的面积是十八平方米与它等底等高的平行四边形的面积是多少平方米 一般化工塑胶桶的材质除了PE的,还有哪些材质的啊?有PP、PET或PVC得吗?有的话在哪里可以买到的啊? 将学校的圆形花坛按1:100比例画在图纸上,花坛的图上面积与实际面积的比是( )
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn