一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

VB怎樣動(dòng)態(tài)加載ActiveX控件

 悟靜 2009-08-01
熟悉VB的朋友對(duì)使用ActiveX控件一定不會(huì)陌生,眾多控件極大地方便了編程,但唯一的缺陷是不能動(dòng)態(tài)加載控件,必須在設(shè)計(jì)時(shí)通過(guò)引用,將控件放置在窗體上。VB6.0已能夠解決該問(wèn)題,只是幫助中沒(méi)有明確說(shuō)明,并且沒(méi)有描述到一些關(guān)鍵功能,由于以前的版本中可以動(dòng)態(tài)創(chuàng)建進(jìn)程外服務(wù):如果對(duì)象是外部可創(chuàng)建的,可在 Set 語(yǔ)句中用 New 關(guān)鍵字、CreateObject 或 GetObject 從部件外面將對(duì)象引用賦予變量。如果對(duì)象是從屬對(duì)象,則需使用高層對(duì)象的方法,在 Set 語(yǔ)句中指定一個(gè)對(duì)象引用:

Dim xlApp1 As Excel.Application
Set xlApp1 = New Excel.Application

Dim xlApp As Object '定義存放引用對(duì)象的變量。
Set xlApp = CreateObject("excel.application")
xlApp.Visible = True

這些語(yǔ)法很容易造成誤導(dǎo),以為動(dòng)態(tài)加載ActiveX控件也是此方法,可能有朋友也象我一樣利用CreateObject嘗試了無(wú)數(shù)次,卻無(wú)功而返,不知微軟公司是出于何種考慮,動(dòng)態(tài)加載ActiveX控件是擴(kuò)展控件集合的方式實(shí)現(xiàn),通過(guò)實(shí)際摸索,終于就如何實(shí)現(xiàn)動(dòng)態(tài)ActiveX控件找出了一條切實(shí)可行的方法,下面以一個(gè)具體的實(shí)例來(lái)詳細(xì)說(shuō)明。
一、ActiveX控件

ActiveX 控件是 Visual Basic 工具箱的擴(kuò)充部分。使用 ActiveX 控件的方法與使用其它標(biāo)準(zhǔn)內(nèi)裝的控件,如 CheckBox 控件,完全一樣。在程序中加入 ActiveX 控件后,它將成為開(kāi)發(fā)和運(yùn)行環(huán)境的一部分,并為應(yīng)用程序提供新的功能。

ActiveX 部件通過(guò)客戶端/服務(wù)器關(guān)系與應(yīng)用程序— 及與部件相互之間— 交互作用??蛻舳耸鞘褂貌考δ艿膽?yīng)用程序代碼或部件。服務(wù)器是部件及其關(guān)聯(lián)的對(duì)象。例如,假設(shè)應(yīng)用程序使用 ActiveX 控件來(lái)提供一個(gè)標(biāo)準(zhǔn)的雇員窗體,供公司的多種應(yīng)用程序使用。提供雇員窗體的 ActiveX 控件就是服務(wù)器,使用這個(gè)控件的應(yīng)用程序就是服務(wù)器的客戶端。

二、加載方法

VB6.0 中對(duì)Controls 集合進(jìn)行了擴(kuò)展,以前版本中Controls 集合在窗體上列舉出已加載的控件,這在迭代過(guò)程中是很有用的。Controls 集合標(biāo)識(shí)一個(gè)叫做 Controls 的內(nèi)在窗體級(jí)變量。如果忽略可選的 object 所在處的整數(shù),則關(guān)鍵字 Controls 必須包括在內(nèi)。我們通常在窗口中使用如下代碼:

Text1.Text="Hello, world"
其實(shí)也可以使用如下代碼達(dá)到同一目的:
Controls(1).Text="Hello, world"

在VB6.0中除了原來(lái)的Clear、Remove 方法外(很奇怪,為什么微軟在VB5.0中只提供這兩種方法,而沒(méi)有提供Add方法,因?yàn)闆](méi)有Add,這兩種方法也就沒(méi)什么用處),增加了Add方法,該方法就是用于動(dòng)態(tài)加載控件的:
Controls.Add(progid as String, Name as String);
progid: ActiveX部件的ProgID,如:"VB.CheckBox";
Name:ActiveX部件加載后的名稱,如: "MyCheckBox";

若要在窗體上添加一個(gè)名為MyButton的按鈕,可以使用:
dim oControl as Object '窗體級(jí)變量
注意:這里聲明為Object對(duì)象類型
Private Sub LoadControl()
Set oControl = Controls.Add
("VB.CommandButton", "MyButton")
     oControl.Left = 10
     oControl.Top = 10
     oControl.Visible = True '使控件可見(jiàn)
End Sub

這是VB6.0的標(biāo)準(zhǔn)語(yǔ)法,它在例程中也是如此演示的,不過(guò)該方法雖然現(xiàn)實(shí)了控件的動(dòng)態(tài)加載,按鈕顯示在窗體上,可以象普通按鈕一樣按下去,但加載的控件不能預(yù)先設(shè)計(jì)響應(yīng)事件代碼,如:事件Sub MyButton_Click()將是非法的,當(dāng)然,可以將要響應(yīng)的事件封裝在控件內(nèi)部。就編程的觀點(diǎn)來(lái)看該方法沒(méi)什么大的用處,開(kāi)發(fā)ActiveX控件的目的是為了資源共享,為了被其他開(kāi)發(fā)人員利用,所以要提供必要的事件接口,顯然利用該方法不行,通過(guò)分析 VBControls等相關(guān)對(duì)象,找出VBControlExtender對(duì)象與EventInfo相結(jié)合能提供事件陷井捕捉, VBControlExtender對(duì)象對(duì)動(dòng)態(tài)添加控件特別有用,它提供了一套通用的屬性、方法、事件給開(kāi)發(fā)人員,它的一個(gè)突出特點(diǎn)是能編程設(shè)計(jì)控件的事件,熟習(xí)類編程的朋友對(duì)帶事件的對(duì)象聲明一定不會(huì)陌生:
Dim WithEvents objElemt as CElemtVBControlExtender 也不例外,聲明的語(yǔ)法一樣,只不過(guò)它有個(gè)特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到對(duì)象使用 RaiseEvent產(chǎn)生的所有事件,EventInfo數(shù)據(jù)結(jié)構(gòu)映射了事件的名稱、參數(shù)個(gè)數(shù)和參數(shù)的值。VBControlExtender和   EventInfo相結(jié)合,采用Select Case 就可以預(yù)先將不同類對(duì)象的事件放置一起,各自獨(dú)立運(yùn)作。將上面的代碼改寫一下就能提供 Click事件了:

Dim WithEvents oControl As VBControlExtender '帶事件聲明聲明之后您就可以在代碼窗口的左上角的對(duì)象下拉框中發(fā)現(xiàn)該對(duì)象出現(xiàn)了,也就是說(shuō),該對(duì)象有了事件或方法了,它的事件有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

當(dāng)然對(duì)微軟提供的標(biāo)準(zhǔn)控件能采用該方法添加,大家都不會(huì)懷疑,但自己開(kāi)發(fā)的控件也能嗎?答案是肯定的,我們可以用一個(gè)實(shí)際的例子進(jìn)行說(shuō)明。
三、實(shí)例描述

假設(shè)一個(gè)本地網(wǎng)絡(luò)的監(jiān)控系統(tǒng),需要在原理圖與實(shí)物示意圖間切換,原理圖包括組網(wǎng)結(jié)構(gòu)、傳輸資源、監(jiān)控主機(jī)等,而實(shí)物示意圖包括路由器、設(shè)備、采集器等,當(dāng)然兩種圖的事件要一致,如雙擊某個(gè)設(shè)備圖形將顯示給設(shè)備的實(shí)時(shí)數(shù)據(jù)等,為了簡(jiǎn)化維護(hù),將原理圖與實(shí)物示意圖封裝成ActiveX控件,由于每種圖需要加載許多圖形控件,消耗資源較大,不能同時(shí)加載,需要將其分解為兩個(gè)控件,在切換時(shí)首先卸載一個(gè)控件,然后加載另一個(gè)控件,所以要實(shí)現(xiàn)動(dòng)態(tài)加載ActiveX控件。

原理圖控件為--Theory.ocx ,對(duì)應(yīng)工程為CTheory;

實(shí)物圖控件為---Fact.ocx ,對(duì)應(yīng)工程為CFact;

注意:為了簡(jiǎn)化,在設(shè)計(jì)控件時(shí)不設(shè)置許可證關(guān)鍵字。

實(shí)物圖控件上的圖形對(duì)象可以被拖動(dòng),拖動(dòng)后的位置信息通過(guò)事件ChangePosition來(lái)通知擁有該控件的窗體,以便下次加載能顯示在最后位置,實(shí)物圖和原理圖控件都有雙擊事件完成的工作相同,其他事件此處忽略。

四、具體示例

1、準(zhǔn)備工作

對(duì)控件Theory.ocx 、Fact.ocx 進(jìn)行注冊(cè)(利用Regsvr32.exe注冊(cè));

建立窗體frmTest.frm ,在窗體上放置按鈕cmdLoadOcx—“原理圖”

2、聲明窗體級(jí)變量與加載函數(shù)LoadControl

Dim WithEvents oControl As VBControlExtender    
'地圖仿真控件對(duì)象
Dim mblnTheory As Boolean    '是否顯示原理圖

Private Function LoadControl(intType As Integer)

If   Not oControl Is Nothing Then
'首先判斷對(duì)象是否存在,若存在則卸載
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 = "實(shí)物圖"
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的參數(shù)EventParamters集合中是以1開(kāi)始的,一般來(lái)說(shuō),微軟新的集合一般是以1開(kāi)始的,而舊的是以0開(kāi)始的,如RdoErrors.Item(0)。
5、關(guān)閉窗口前卸載控件

Private Sub Form_Unload(Cancel As Integer)
Controls.Remove("MapView")
Set oControl = Nothing
End Sub

6、特別注意
通過(guò)Controls.Add方法添加的ActiveX控件一定不能在該工程中有該控件的任何引用,否則系統(tǒng)將出錯(cuò)。

五、小結(jié)

通過(guò)使用動(dòng)態(tài)加載ActiveX控件使用龐大的應(yīng)用程序變得很小,將不同的ActiveX控件進(jìn)行各種組合,使應(yīng)用程序更加靈活多變,如您的應(yīng)用系統(tǒng)要處理三十種門禁,而某個(gè)具體的用戶可能只有一種或兩種門禁,根本沒(méi)必要首先將所有門禁包含到應(yīng)用中,可將各個(gè)門禁獨(dú)立封裝,只安裝注冊(cè)需要的組件,就象 Windows的自定義安裝一樣。微軟的未來(lái)技術(shù)基礎(chǔ)是分布式的組件技術(shù)(DCOM),將會(huì)把代碼的重用發(fā)揮得淋漓盡致。您不妨試一試動(dòng)態(tài)加載,也許會(huì)產(chǎn)生令您驚喜的效果!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日韩精品视频香蕉视频| 99久久精品午夜一区| 在线观看那种视频你懂的| 国产一区二区三区口爆在线| 女同伦理国产精品久久久| 欧美国产日本高清在线| 高潮少妇高潮久久精品99| 久久精品国产亚洲av麻豆| 老司机精品福利视频在线播放| 一个人的久久精彩视频| 日本加勒比中文在线观看| 激情内射日本一区二区三区| 又大又长又粗又猛国产精品| 国产精品美女午夜福利| 成人日韩在线播放视频| 狠狠做深爱婷婷久久综合| 日韩精品区欧美在线一区| 久久99青青精品免费| 国产精品自拍杆香蕉视频| 成人免费在线视频大香蕉| 好吊色免费在线观看视频| 国产一区二区精品丝袜| 久草视频在线视频在线观看| 欧美又黑又粗大又硬又爽| 日本东京热视频一区二区三区| 国产精品午夜福利免费阅读| 少妇熟女精品一区二区三区| 国产激情一区二区三区不卡| 日韩精品视频高清在线观看| 国产成人精品在线播放| 熟妇久久人妻中文字幕| 欧美日韩国产的另类视频| 亚洲性日韩精品一区二区| 亚洲一区二区精品久久av| 美女被啪的视频在线观看| 国产精品熟女乱色一区二区| 少妇一区二区三区精品| 欧美精品亚洲精品日韩专区| 女人精品内射国产99| 97人妻人人揉人人躁人人| 国产黑人一区二区三区|