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

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

VB如何改变 NT 预设的打印机? VB如何改变 Windows 预设的打印机 VB如何关闭其他程序 VB如何过滤键盘录入 VB如何获得Windows95已经运行的时间 VB如何检测左右键同时按下? VB如何检查您的电脑是否打开 ActiveDesktop? VB如何将程序建立成“启动”文件夹的捷径? VB如何将程序建立成「启动」资料夹的捷径。 VB如何结束 Shell 所启动的程序? VB如何拦截键盘输入 如何判定VB调用的一个EXE程序已经结束. VB如何判断某一个Drive是否为光碟机? VB如何清空回收站? VB如何取得汉字的区位码 VB如何去优化你的VB程序 VB如何让点阵打印机每次印出一行? VB如何设计一个可中断循环的按钮。 VB如何实现VB程序登录密码加密 VB如何使程序不出现在任务列表中 VB如何使键盘、Mouse失效(JournalPlayBack Hook) VB如何使用 DBGrid VB如何突破 TextBox 32K 的限制? VB如何为执行程序加上参数? VB如何压缩较长的全路径文件名中的路径 (Path) 字串长度? VB如何在VB中实现密码的读取 如何在VB中使用命令行参数 VB如何在内存中的指定位置取数据? VB如何在已经存在的文本的textbox添加新的一行 VB如何在資料庫中存入單引號? VB如何正确使用VB6访问Access2000数据库 怎样在pb8中改一个windows 的名字. 有关windows rpc 编程的问题 如何把JPG图片存入数据库? 老大:Node<T>这个是什么意思?MSDN也没说,还有template <class T>又是什么意思?小弟不明白 datagrid中的问题:删除datagrid中的记录时出现的问题。 求助:TextBox中输入中文简繁体日文的乱码问题,谢谢! 一段小小的Java程序,请指点指点!!!多谢! 请大家都来关注!谢谢 各位,怎样在C#里面声明定长的字符或定长的数据 MFCGridCtrl的问题,很难,但我还是要碰碰运气! 数据窗口中某列(列名为AA)的编辑风格设为DropDownListBox,在脚本中怎样添加DropDownListBox中的内容? 再次请教EJB. 我想做钱能编的《C++程序设计》习题集的网站! 怎样可以得到当前window对应于屏幕的坐标呢 请问在vs.net编写aspx时,怎样才能在写.时,后面的属性或方法能出来 能告诉我ORACLE触发器的语法吗? 怎么画不出图来? 如何定一个文件类型的变量? 水晶报表,多列(分栏)打印 如何使安装程序汉化?我使用的是installshield6.2 谢谢! datagrid中的问题:删除datagrid中某行时出现的问题。 使得窗口总是处于最前的函数是什么,谢谢 请教:如何用Sql实现查询本周发的帖子?? 如何用程序设置ie的页面设置中的页眉,页脚,边距和方向? 为什么要学Java http://Scjp.myrice.com 也许你的一切会改变! 请问怎么修改InstallShield中的可选项,如Typical、Compact、Custom等。 如何.定制通用对话框中的路径及文件名? 我照着网站上的中文输入法提示,做了可没效果 为什么要学Java 看 http://Scjp.myrice.com 也许你的一切会改变! 回答问题,我给500分!! 语音聊天用什么软件好?qq,netmeeting,yahoo message or icq? 为什么不能汇编成功? 各位,帮我一下,非赏急! 数据库快照复制问题,总出错,求救!(50分) 请问这是怎么一回事。win2k(p)+tomcat+jdk1.4.` 在VB中怎样设置Excel单元格的样式?如设置为百分数显示单元格数值? 下拉菜单问题? 请问这是怎么一回事。win2k(p)+tomcat+jdk1.4.` 求救,我财务系统的问题,大大们一定要帮助我呀! 我在调试jsp是的一个错误信息,请指教~~~ 急!!! 一个烦人的问题 关于在应用程序中使用dll中资源的问题 關於並行執行的問題 也许你现在就会改变!! 看 http://Scjp.myrice.com 为什么要学Java 其实我们很封闭! 关于NT的小问题! 请问: 請問哪里有c++的書籍下載? 几个控件重叠在一起,怎样用代码的方式使其中的某个控件在运行时放至最上!?谢! 也许你现在就会改变!! 看 http://Scjp.myrice.com 其实我们很封闭! 如何发布我的网站? 我的动物朋友作文最好是小狗的,写出它与我的关系,它颜色.样子,爱好,爱吃什么!(急,就今天,明天就要交作业了!) 甲乙丙三杯的水量分别是100毫升,200毫升,60毫升,在这三杯水中分别加入20毫升,4甲乙丙三杯的水量分别是100毫升、200毫升、60毫升,在这三杯水中分别加入20毫升、40毫升、15毫升的蜂蜜要把三杯 抛物线y^2=2x与直线y=4-x围成的平面图形的面积(积x计算) 作文 我的动物朋友500字以上哦! 有甲乙丙三杯水.第一次从甲杯倒出水到乙丙两杯,使两杯各增加1倍;第二次从乙杯到出水到甲丙,使甲丙两杯也各1倍.这时三杯水都是64克.原来甲杯有水(  )克 20句写得优美的句子, 求!一篇我的动物朋友的作文500字就行,谢谢! 甲乙丙三杯水里各装有水……求一道数学题甲乙丙三杯水里各装有水若干毫升,现将甲杯中的水倒入乙杯中,使乙杯中水加倍;然后把乙杯水倒一些入丙杯中,使丙杯的水加倍;又把甲杯中的水倒 人教版初一上册语文书 双曲线X的二次方/9-Y的二次方/16=1的渐近线方程是? 甲乙丙三杯水共重十二分之十一千克,其中甲乙水共重四分之三,甲丙共重三分之二.甲乙丙每杯水重多少? 怎么样用一个可以装5千克水的捅和一个可以装3千克水的桶装出4千克的水 求与双曲线y平方/9-x平方/16=1有共同渐近线,且过点M(-3,2倍跟号3)的双曲线方程 求抛物线y^2=x和直线y=x-2所围成的平面图形的面积 蝴蝶是否是昆虫不是 什么蜇人的昆虫用泥建穴 求由抛物线y=1-x^2;x=0,x=2及y=0所围成的平面图形的面积 蝴蝶是昆虫吗 马蜂蜇人后会死蜇棉铃虫后为什么不会死? 求抛物线y∧2=x与直线y=x-2所围成的平面图形的面积 水怎么样用一个可以装5千克水的捅和一个可以装3千克水的桶装出4千克的水 作文,你从动物或植物得到什么启发,350字左右 写动物或植物的作文可以写些什么 能寄生在人的大脑上的寄生虫是什么 苏教版 的初一上册语文书背诵地方的课文(有的是作业要背的)我出去旅游但是把语文书忘在家了苏教版 的初一上册语文书背诵地方的课文(有的是作业要背的)这是我的作业 描写“日”的300字短文. 蚂蚁的村落作文一篇400字 初一上册的语文书课文的目录 快………………………………初一上册的语文书课文的目录快…………………………………………………………………… 形容一个眼睛不大,说话还行,嘴巴挺小(不是樱桃嘴)的女生怎么形容(一段话,不用太多我已经写了,可以不回答 写一篇作文:蚂蚁的村落,400字 初一的语文书课文是什么? 鹅毛雪,柳叶眉,樱桃嘴,这类的词语前两个表示物品 求抛物线y=x^2与直线y=4所围成的图形面积越快越好 谢谢 甲瓶中有8千克油,另有乙、丙两个空瓶,分别能装油5千克和3千克,请你设计一下,如何利用这三个瓶把甲瓶的油分成两个4千克? 甲瓶中有8千克油,另有乙,丙两个空瓶,分别能装5千克和3千克,请你设计一下,如何利用这三个瓶把甲的油分成两个4千克? 以《蚂蚁的村庄》为题,写一篇500字作文注:《草虫的村落》是范文今天,我又趴在草丛边,在无限的静谧中,忘了世界也忘了自己.在我眼前,空前变大了,小草成了大森林.一只小蚂蚁,独自四处走 甲瓶有8千克油,另有乙,丙两个空瓶,分别能装5千克和3千克,如何利用这三个瓶把甲瓶的油分成两个4千克? 女人说自己的樱桃是什么意思 求直线y=x+2与抛物线y=x^2所围成的图形面积是多少? 求教这些是什么种类蚕蛾的幼虫名称dirphia sp(familia saturniidae)eucanella sp(familia saturniidae) 形容女生的嘴巴的词语有哪些 一篇200字观察蚂蚁的 作文 ( )是蚕的幼虫,蚕蛾是蚕的( ). 苍蝇是昆虫吗 求由抛物线y=x^2与y=2-x^2所围图形的面积 有谁有赞美美食的诗句啊? 6课的生词 求由抛物线y2=2x 及直线 y=x-4=0所围成的平面图形的面积 赞美南瓜饼好吃的句子 过p(1,0)作抛物线y=根号(x-2)的切线,求切线方程 由抛物线y=x^2,与直线y=2x+3所围成的平面图形的面积 描写美食的诗句 数学在线解题器y=根号下x过(-1,0)点的切线与y=根号下x,x=0所围成的平面图形的面积 求抛物线y=2x的平方.与直线y=2x+4所围平面图形的面积. 甲瓶有8油千克,乙丙两个空瓶分别装油5千克和3千克问怎么把甲瓶的油分成两个4千克呢 求抛物线y^2=4(1-x)在(0,2)处的切线和x轴所围成的平面图形,绕x轴旋转所得的旋转体的体积 求抛物线y=x^2与直线y=2x所围平面图形的面积 作文 《我的动物朋友》描写你和小动物之间发生的事 500字 甲瓶装油8千克,另外有乙、丙两个空瓶,分别能装油5千克,请你设计一下.如何把甲瓶的油分成两个四千克? 求一些优美的描写的句子
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘