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

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

十款最新开源的开发者工具/应用(组图) Django 1.5发布,Python 3开始进入主流? [爆料]英特尔:将Hadoop“固化”到Xeon中 姗姗来迟:微软终于发布Windows 7 IE10正式版 谷歌推Google+登录系统 与Facebook争夺用户信息 微软在CodePlex上开源C++ REST SDK 代号Casablanca 论OpenAPI的起源与历史 LinkedIn开源低延时变化数据捕获系统Databus 微软发布全新WP应用 随时查看App崩溃信息 做iOS开发,我为什么弃用Objective-C而选择RubyMotion? Stinger Initiative:让Hive提速100倍 2013年云计算的九大威胁 W3C小组发起新“汽车与Web平台业务组”项目 苹果CEO:请忘掉股价 未来依然有伟大产品 两周营收100万,GO桌面在Google Play做对了什么 “吸金王”Puzzle & Dragons是如何炼成的 初创公司Kickboard:让父母了解孩子的在校表现 Rackspace收购开源数据库公司ObjectRocket 投资人表示微软应推出iPad版Office 三星:谷歌养大的一匹狼 UC九游年度战略:2013计划分成超3亿元 X-Canvas:UC将发布高性能HTML5游戏引擎 淘宝:OceanBase分布式系统负载均衡案例分享 Cloud Foundry面临代码分支 策略为王股票软件VC源代码简介 StarCraft开发:用肮脏的技巧解决难题 忠于用户:美团1000亿的卫星与Groupon的窘境 360周鸿祎开放日回应质疑:都是做搜索惹的祸 轻量级的高性能Web框架:Play 为什么会失败?社交鼻祖Friendster的“验尸”报告 那些年Google公开的大数据领域论文 请问在JBuilder中怎么调整控件的位置好啊? 怎么在非客户区添加个按钮?遮住最大化按钮呢?我头都想炸了 请问如何查看WIN2000系统里是否被安装了类似“冰河”之类的软件? 如何打印整个对话框 寻找将realplay录像(ram格式文件)转换成mpeg或avi的软件。 OTDR(TD3000)的接口编程,谁做过!!!!!!!!!!!!请进 百分求方案!!请大家不吝赐教!(报表汇总,打印相关,有一定难度!!!) 干掉最大化按钮! 谁能帮我解释一下Petzold这些话的意思: 绝对给分,谢谢各位大侠帮我解决这个很简单的问题罗!:( 关于古老的DDE通信的几个头痛的问题. yangrenzhi你今天怎么啦,有事就说出来啊 如何获得一个变量的字节长度 关于JAVA的简单问题(送分) 为什么不能筛选数据? 有关Acrobat 组件的错误 关于火车查询 CTreeCtrl 的同一item项被多次点击时,会出发什么消息?你知道吗? WINCE的市场 控件ID有何用? 初学XML,请问ASP传回的中文字怎么是乱码? 请问圆锥体侧面积计算公式是什么?快阿,正在考试!!!!!!!!!!!!!! (♂逍遙剑♂) 过来聊聊!进来! 怎样用文件的形式对数据库进行备份? 能在标题栏添加控件吗?谁能告诉我? 谁知道在Activex控件中事件执行顺序的问题 3山好可怜,被女人抓住了把柄,知道了粗细长短,哎。。。 想在odbc里用程序的方法建立驱动,怎么实现? vc编的DLL怎样处理LIB在BCB中可以直接用哦?我用WINAPI那个约定 救命的!!! 深圳的“同志”好多啊!有一个哥们还向我推荐了一个同志网站,可惜我不是同志,如果有同志需要的话,可以去找那些深圳同志接头! 有懂EJB ,weblogic 大连的朋友吗? to fightwolf:give she some color to see see. 装delphi 6之前是不是要装ie5.5? 现在有一个问题:在大数据量传输的情况下,想采用异步传送方式,请问如何实现? 关于比例问题!! 有人说:做程序员很累,但我很快乐?广大程序员朋友们,有谁同意这个说法吗? 那该怎么办? MFC开发的ActiveX怎么都是OCX,可不可以是DLL,如果可以该怎么做。 如何获得当前活动控件的引用? 哪里有获得指定IP地址的机器网卡MAC地址的源程序? 新手上路:请问系统安全的市场前景如何? 'select * from a where b like ''[as]%'''这一句有没有错呢? 哪能找到 VBScript 5.0 的联机文档 为什么第七期的杂志我还没收到啊!!~~,原以为提前先订几期,会早点收到!唉!~~ php打开CSV文件的问题!答来分去! 各位有用过aspchart这个控件的吗?为什么我不能生成图片呢? 我有一个问题大家帮我UP一下 用HTML可以制作留言版吗?有使用mailto的吗? 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊! 因为JAVA,我差点把机子砸了 一辆玩具车在一条直线上跑,先向后跑了6米,记作-6米,那么玩具车又跑了+6米是什么意思?这时它离移动前的位置有多远? 20mL 0.1mol/L的CH3COOH溶液中和10mL 0.1mol/L NaOH溶液 请列出所有粒子的浓度大到小?请说明为什么这样排 中和100mL 1mol/L的H2SO4溶液,需要多少g 1.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车101.备车 2、停车3、完车4盘车5正车6倒车7飞车8冲车9试车10并车11车钟12一车13二车14三车 常温下,用0.1MOL/L的NAOH滴定20ML.0.1MOL/L的HAC溶液.当V(NAOH)=10ML时.溶液中:C(AC-)+2C(OH-)=C(HAC)+2C(H+) 为什么是对的? 中和100ml 1mol/L的硫酸 需要多少的NaOH? 朗逸车LAVIDA1.6下面一排小的英文是什么意思 0.1mol/L的硫酸20mL与0.2mol/L的硫酸10mL混合,求混合液物质的量浓度用0.6mol/L的NaOH溶液A与0.1mol/L的溶液B混合配制0.2mol/L的NaOH溶液,求A与B的体积比 用20ml0.2mol/L的NAOH溶液中和0.1mol/L硫酸溶液,需要盐酸溶液的体积是多少? 一瓶葡萄糖盐水是多少毫升?实际调查噢! 将20ml 0.1mol/L NaOH 溶液和 10ml 0.1 mol/L CH3COOH 溶液混合后并加强热,最终得到的固体是?答案是Na2CO3 等体积的o.1mol/L盐酸,硫酸,用o.1mol/L氢氧化钠溶液中和,当恰好完全反应时,消耗NAOH溶液体积的大小 5%葡萄糖注射液 500ml 【规格】:500ml,25g 该注射液中葡萄糖的物质的量浓度为5%葡萄糖注射液 500ml【规格】:500ml,25g该注射液中葡萄糖的物质的量浓度为____. 现有25ml盐酸和硫酸的混合液,加入1mol/L的NaOH溶液25ml恰好中和,在中和后的溶液中加过量的Ba(OH)2溶液,所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度各是多少? 若100mL0.1mol/L硫酸铝溶液和氢氧化钠溶液反应得到1.17g沉淀,则需要0.5mol/L的NaOH溶液的体积我知道答案就是不明白为什么分Al离子过量和OH根过量 求该注射液中葡萄糖的物质的量浓度.葡萄糖(C6H12O6) 将100毫升0.2mol/l的NaOH溶液与多少毫升的0.1Mol/L的硫酸溶液混合,才能恰好完全中和 若100mL0.1mol/L硫酸铝溶液和氢氧化钠溶液反应得到1.17g沉淀,则需要0.5mol/L的NaOH溶液多少毫升?当OH-过量时为什么 Al3+是0.02mol?谁给我讲明白追加20 我Q 10561252 医用葡萄糖注射液的葡萄糖的质量分数为5%.密度约为1g/cm³,则此注射液中葡萄糖的物质的量浓度是多少希望稍微详细点 中和100ml 1mol/l的硫酸,需要多少氢氧化钠(质量)? 在100ml 1mol/L盐酸溶液中加入50ml,1mol/L氢氧化钠溶液后,将反应后溶液加水稀释至500ml,则稀释后溶液的PH值是多少? 500ML的葡萄糖注射液,重量是多少克(大概)?这种葡萄糖注射液的葡萄糖浓度是多少? 2mol/L的硫酸100ml能与多少毫升1mol/L的氢氧化钠完全中和 0.1mol/l的HCL与0.1mol/lNaOH反应多滴一滴NaOH(0.05ml)将溶液稀释50ml 问溶液PH值 500ml水中含有25g葡萄糖,该葡萄糖溶液的质量分数 完全中和100ml、0.1mol/L的硫酸溶液、需要0.05mol/L的氢氧化钠溶液多少毫升 将一定质量的MgAl合金全部溶解在500mL盐酸中(体积变化不计),取10mL反应后的溶液,用1mol/LNaOH溶液滴定得下图关系.(1)求Mg,Al质量各是多少?(2)求盐酸的物质的量浓度为多少mol/L? 500ml内含葡萄糖25g,先要配制20kg这种葡萄糖注射液,需要葡萄糖多少千克? 将镁铝的混合物0.1mol溶于100mL2mol·L-1硫酸溶液中,再滴加1mol·L-1氢氧化钠溶液,若在滴加NaOH溶液过程中,沉淀质量m随加入氢氧化钠的体积v变化关系如图.当V1=160ml时,请回答(1)无视镁铝比例如何 实验室需要0.1mol/LNaOH溶液450mL和0.5mol/L的硫酸溶液500mL.根据这两种溶液的配制情况回答下列问题.根据这两种溶液的配制情况回答下列问题.用质量分数为98%密度为1.84g/m³的浓硫酸体积为 5%葡萄糖(C6H12O6)注射液 500mL 【性状】………… 【规格】500mL,25g 1)该葡萄糖注射液中葡萄糖的质量不明白质量分数的计算中是否应当再次加上水的质量,若加了,就变成百分之4.8,若不加则为 将0.1mol的镁铝混合物溶于100ml 2mol/L的H2SO4中,然后滴加1mol/L的NaOH溶液,请回答:⑴若在滴加NaOH溶液的过程中欲使Mg2+、Al3+刚好沉淀完全,则滴入NaOH溶液体积为________ml⑵若混合物仍为0.1mol其中 向0.1mol\L的AL2(SO4)3溶液100mL中加入0.5mol\LNaOH溶液得到1.17沉淀,加入的NAOH溶液的体积可能是A.130ML或90ML B.100ML或50ML1.17后面是 克 5%葡萄糖(C6H12O6)注射液 规格:500ml 25g 求该注射液中葡萄糖的物质的量浓度为多少?该注射液的质量分数是多少? 将镁铝的混合物0.1mol溶于100mL2mol·L-1硫酸溶液中,然后再滴加1mol·L-1氢氧化钠溶液,请回答以下问题:若在滴加NaOH溶液过程中,沉淀质量m随加入氢氧化钠的体积v变化关系如图.当V1=160ml时,金属粉 完全中和0.1mol/LNaOH溶液500ml,需要硫酸的物质的量是多少?若硫酸的物质的量溶度为0.20mol/L,则需要硫酸 将25g葡萄糖溶于水,配成500ml溶液该溶液的质量浓度为多少 将镁铝混合物0.1mol溶于100ml2mol/l的硫酸溶液中,然后在滴加2mol/l亲氧化钠溶液 19.将一定质量的Mg.Al合金全部溶解在500ml盐酸中(体积变化不计),取10ml反应后的溶液,用1mol/L的NaOH溶液滴定得下图关系 (1)求Mg.Al质量各是多少?(2)求盐酸的物质的量浓度为多少?就是没图 如何用含结晶水的葡萄糖C6H12O6·H2O配制质量为50.0g/L的葡萄糖溶液500mL?设溶液密度为1kg/L,该溶液的物质 将0.1mol镁、铝合金溶于100mL2mol/L的H2SO4溶液中,然后滴加1mol/L的NaOH溶液,生成沉淀与所加NaOH溶液体积的关系如图所示当溶液中Mg2+、Al3+恰好沉淀完全时,V(NaOH)=当V1=160mL时,金属粉末中镁的物质 将5.1克Mg、Al合金投入500mL 2mol/L盐酸中,金属完全溶解后,再加入4mol/LNaOH溶液多少毫升时所得沉淀质量最多? 您好 请问如何用含结晶水的葡萄糖配置质量浓度为50g/L的葡萄糖溶液500ml? 某种未知浓度NaOH的溶液25ml,加入20ml,1mol/L的H2SO4溶液后显酸性.再滴入1mol/L ,KOH溶液1.5mL,恰好呈中性.计算NaOH溶液的物质的量浓度 蒋30mL0.5mol/LNaOH溶液加水稀释到500mL,稀释后溶液中NaOH的物质的量浓度为( )A.0.3mol/L B.0.03mol/L 二氧化硫和氧气化合 催化剂是什么? 现有25mlHCl和H2SO4的混合液,加入1mol.L^-1的NaOH溶液25ml恰好中和,在中和后的溶液中加入过量的Ba(OH)2溶所得沉淀质量为1.7475g,求混合溶液中盐酸和硫酸的物质的量浓度 将30ml 0.5mol/LNaOH溶液加水稀释到500ml,稀释后溶液中NaOH的物质的量浓度是? 1.2.3.4.5.6. SO2与O2的混合气体中,O2的体积分数是50%,则该混合气体在标准状况下的密度是 某盐酸溶液25ml,加入1mol/L的Ba(OH)2溶液20ml,剩余的酸需用0.5mol/L的NaOH溶液20ml才能恰好中和.求该盐酸溶液物质的浓度? 10转6股派1. 在标准状况下.2.24升二氧化硫和氧气的混合气体中所含的氧原子数为多少?怎么算的 某盐酸溶液25ml,加入1mol/L的Ba(OH)2溶液20ml,剩余的酸需要0.5mol/L的NaOH溶液20m求该盐酸的溶液的物质的量浓度 六串一什么意思 要出去氧气中混有的二氧化硫气体,最好让混合气体通过A 浓硫酸 B 氢氧化钠溶液 C 澄清石灰水 D 蒸馏水 为什么? 100mL 0.1mol/L 的两溶液中和等物质的量的氢氧化钠关于盐酸和醋酸说法正确的是:100mL 0.1mol/L 的两溶液能中和等物质的量的氢氧化钠 ?这句话对吗?为什么? 每辆汽车后面都有一个小数(比如说1.6).这个小数代表什么 10ml 0.1mol/L HCL 与10ml 0.2mol/L NaOH混合,求该混合溶液的PH值. 100mL 1MOL/l氢氧化钠溶液与100mL 1mol/L的硫酸溶液恰好中和
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn