ole控制項
ole控制項
OLE 控制項(現在稱為ActiveX 控制項)OLE(發音為“oh—Lay”)的全稱是:Object Linking and Embedding(對象鏈接與嵌入)。可以在 Windows 應用程序的對話框中使用,或在萬維網的 HTML 頁中使用。
1、OLE
OLE的本質就是構件或軟體,所謂構件就是別人已開發好的項目(即應用程序或數據等),可用在新開發的應用程序中而不必重新開發,提高開發效率。
OLE的含義已超出了鏈接和嵌入這兩項功能,在應用程序中不僅能交換數據,還可交換功能。
2、伺服器應用程序和客戶應用程序
把提供嵌入及鏈接對象的應用程序,稱為伺服器應用程序(Servers),在VB中也稱為“對象應用程序”。
把接受嵌入及鏈接對象的應用程序,稱為客戶(Clients)應用程序,在VB中也稱為“控制應用程序”。
3、對象(Object)
指為其它應用程序提供的具有獨立特性的數據或代碼單元。
例如:Microsoft Excel中的一個工作表、或圖畫文件、聲音文件、視頻文件、或一個完整的應用程序等都可作為一個OLE對象。
4、對象鏈接(Object Linking)
對象鏈接是指在應用程序中插入對象的佔位符(指針),而不是數據本身。
在該對象上看到的只是一個“影像”,真正的數據儲存在一個獨立的文件中。因此,別的應用程序也可鏈接到該文件,當別的應用程序啟動鏈接對象,並進行修改,則原來鏈接的應用程序所看到的內容也將跟著變動。“鏈接”對象的數據儲存在提供鏈接的應用程序(對象應用程序)那邊。
5、對象嵌入(Object Embedding)
對象嵌入是指將對象嵌入到Clients應用程序中,這樣,嵌入對象將會增加Clients應用程序的大小。用戶可以在Clients應用程序中直接編輯嵌入的對象(編輯時自動開啟製造對象的應用程序讓用戶做編輯工作)。
☆ 對象鏈接和對象嵌入是兩種不同的數據共享方式,兩者的主要區別在於:
(1)數據存儲的地方不同:
“鏈接”對象的數據存儲在提供鏈接的應用程序外邊;
“嵌入”對象的數據存儲在接收嵌入對象的Clients應用程序中。
(2)其它應用程序可以訪問數據的方式不同:
其它應用程序也可以訪問“鏈接”對象,一個數據源可以鏈接到多個應用程序。
其它應用程序不能訪問“嵌入”對象中的數據。
(3)影響Clients應用程序軟體的大小不同。
VB提供了一個OLE容器控制項(在工具箱中),用於容納“鏈接”對象或“嵌入”對象,也就是說,可以使用OLE容器控制項來插入對象。
當然,也可用其它方法來插入對象。如:通過在工具箱中添加對象的類來插入對象,具體操作步驟為:
①→“工程”菜單/“部件”命令
②→“可插入對象”選項卡
③→想要加入工具箱的類,如:“Microsoft Excel工作表” →“確定”
在使用OLE容器控制項插入對象時注意:
(1)創建鏈接時,鏈接對象數據被存儲在OLE容器控制項之外;
創建嵌入對象時,嵌入對象數據和VB應用程序一起被保存在OLE控制項之內。
(2)在任何時候,一個OLE容器控制項內只能有一個對象。
(3)既可在設計階段來插入對象(創建鏈接對象或嵌入對象);也可在程序運行階段通過代碼來創建鏈接對象或嵌入對象。
(4)通過OLE控制項的Display Type屬性可控制OLE對象在OLE容器控制項中的顯示方式:
Display Type :0 → 以“數據映象”方式顯示
Display Type :1 → 以“圖標”方式顯示
一旦建立好一個OLE對象,此對應的OLE對象顯示方式將無法改變。
(5)在OLE容器控制項中放置對象之前提供該對象的應用程序必須已經在Windows中註冊其對象。
1、設計時插入一個“鏈接”對象
步驟:(1)添加一個“OLE容器控制項”到窗體上,屏幕會彈出一個“插入對象”對話框。或在設置好的“OLE容器控制項”上右擊滑鼠,也會彈出“插入對象”對話框。
(2)選擇“從文件創建”,再通過“瀏覽”按鈕確定“要鏈接文件的路徑、文件名”: ①C:\lyh\gz.xls\Excel工作表
②C:\win98\a.bmp\BMP圖象
(3)單擊“插入”按鈕→返回“插入對象”對話框。
(4)選中“鏈接”複選框→“確定”。
按照以上步驟,就建立了一個鏈接對象。
此時,OLE控制項本身則保存與對象鏈接有關的信息。如:提供鏈接對象的應用程序名、鏈接文件名、以及該鏈接對象的“數據影像”等,其對應的OLE控制項屬性分別是:對象類型(Class)、引用源文件(Source Doc)、鏈接數據(Source Item)。
[注意]:設計鏈接對象時,OLE會保留一份影像,起初這份影像和數據文件是相同的,但是因為文件有可能被修改,可鏈接對象保存的仍然是原始數據的影像,為了使其具備自動更新的能力,只要在Form_Load事件過程加入如下代碼:
Private sub Form_Load( )
OLE1.Action=6 ‘此語句用“OLE1.Update”方法也可以
End sub
2、設計時創建“嵌入對象”
創建嵌入對象時,既可從文件中嵌入數據,也可以創建一個新的空對象(可以被以後的數據填充)。
步驟:(1)添加一個“OLE容器控制項”到窗體上,屏幕顯示“插入對象”對話框。
(2)選擇“從文件創建”,→“瀏覽”按鈕→確定要嵌入的“文件名”。
(3)→“插入”按鈕→返回“插入對象”對話框。
(4)→“確定”,即可創建嵌入對象。
另外,在此設計狀態,也可修改OLE對象中的數據,方法為:
(1)→在OLE對象數據區單擊滑鼠右鍵,→彈出快捷菜單。
(2)選擇“編輯”命令→出現Excel的編輯環境。
(3)修改完畢后,單擊OLE對象數據區以外的區域,返回到創建嵌入對象的窗體。
[注意]:(1)不同於對象鏈接的是,嵌入對象中的數據被用戶修改後不會被自動存儲。當含有OLE控制項的窗體被關閉時,與該控制項相關的數據的任何變化將丟失。如果希望對數據所進行的修改在下次運行時能夠顯示出來,需要將更改的數據從對象保存至文件中(使用OLE控制項的Save To File方法)。數據被保存在文件后,可以在需要的時候打開文件並恢復對象(使用OLE控制項的Read From File方法)。
(2)將更改的數據從對象保存到文件中的方法(用一命令按鈕的單擊事件過程說明):
Private sub CmdSave_click( )
Dim FileNum as integer
FileNum=FreeFile ‘取文件號
Open “TEST.OLE” For Binary as #FileNum ‘打開要保存的文件
OLE1.SaveToFile FileNum ‘保存至文件
Close #FileNum ‘關閉文件
End sub
(3)將數據從文件讀入OLE容器控制項(使用OLE控制項的ReadFromFile方法)
用一命令按鈕的單擊事件過程說明:
Private sub CmdOpen_click( )
Dim FileNum as integer
FileNum=FreeFile ‘取文件號
Open “TEST.OLE” For Binary as #FileNum ‘打開文件
OLE1.ReadFromFile FileNum ‘讀文件
Close #FileNum ‘關閉二進位文件
End sub
3、使用“特殊粘貼”對話框創建鏈接對象或嵌入對象。
設計時創建對象的另一方法是使用“特殊粘貼”對話框,應用該方法可以只利用文件的一部分數據。(如只使用Excel數據表的一部分數據)
步驟:(1)運行一個包含鏈接或嵌入數據對象的應用程序(如Excel應用程序)。
(2)打開一個文件,選擇要鏈接或嵌入的數據。
(3)→“編輯”菜單/“複製”命令→複製“數據”到剪貼板上。
(4)在VB的一個包含OLE控制項的工程中,右擊OLE控制項→選擇“特殊粘貼”命令→彈出“選擇性粘貼”對話框。
(5)若想建立嵌入對象,選擇“粘貼”選項;若OLE控制項中已有一個對象
若想建立鏈接對象,選擇“粘貼鏈接”選項;則會詢問是否刪除現有對象
(6)作出回答后,即在OLE控制項上建立了一個新的對象。
4、利用OLE發出聲音(實例)
步驟:(1)在窗體上添加OLE控制項時,→彈出“插入對象”對話框,
在“對象類型”列表框中選“聲音文件”;
選擇⊙從文件創建;
→“瀏覽”按鈕,選擇文件:C:\windows\Canyon.mid ;
選擇 鏈接,顯示為圖標。
(2)單擊“確定”按鈕。
運行程序,雙擊OLE對象,將播放一段音樂。
三、在運行階段創建鏈接或嵌入對象
要在程序代碼運行時創建鏈接或嵌入對象,需要了解OLE容器控制項的屬性、事件和方法。
1、OLE容器控制項的屬性、方法、事件:
l Action屬性:指定作用在OLE控制項上的動作(如建立、刪除、啟動等)。
語法為:object.Action=value
value的設置值如下表:
value值 | 描述 | 方法 |
創建嵌入對象 | Create Embed | |
1 | 創建鏈接對象 | Create Link |
4 | 將對象複製到系統剪貼板 | Copy |
5 | 將對象從系統剪貼板複製到OLE容器控制項 | Paste |
6 | 從提供對象的應用程序檢索當前數據,並在 OLE容器控制項中將該數據作為圖片顯示。 | Update |
7 | 打開一個對象,用於進行諸如編輯那樣的操作 | DoVerb |
9 | 關閉對象,並與提供該對象的應用程序終止連接 | Close |
10 | 將指定的對象刪除,釋放與之關聯的內存 | Delete |
11 | 將對象保存到數據文件中 | SaveToFile |
12 | 載入保存到數據文件中的對象 | ReadFromFile |
14 | 顯示“特殊粘貼”對話框 | PasteSpecialDlg |
17 | 更新對象支持的謂詞列表 | FetchVerbs |
18 | 將對象以OLE version 1.0版本的文件格式保存 | SaveToOle1File |
l Class屬性(類屬性)
格式為:object.class
類名包含幾個部分:application.objecttype.version
類名:說明對象類型。
Application :提供對象的應用程序名
Objecttype :在對象庫中定義的對象名
Version :提供對象的應用程序的版本號
例如:Excel.Sheet.8
l OLEType Allowed屬性
返回或設置OLE容器控制項所能包含的對象類型。
語法為:object.OLETypeAllowed [=value]
value值的設置如下表:
常數 | 值 | 描述 |
VbOLELinked | 鏈接的,OLE容器只能包含鏈接對象 | |
VbOLEEmbeded | 1 | 嵌入的,OLE容器只能包含內嵌對象 |
VbOLEEither | 2 | 二者均可(預設值) |
l SourceDoc屬性
指定鏈接或嵌入對象時使用的源文件名。
語法為:object.sourceDoc [=name]
name :指定文件名的字元串表達式。
l SourceItem屬性(只對鏈接有效)
在創建鏈接對象時,設置或返回要鏈接的文件內的數據。
語法為:object.sourceItem [=string]
string :一個指定被鏈接數據的字元串表達式。
例如:A1 :E1 或 A3C4 :A9D10
[注意]:當使用Action屬性創建鏈接對象時,用SourceDoc 屬性指定要鏈接的文件,使用sourceItem屬性指定在要鏈接文件內的數據。
l Create Embed方法
該方法用來創建一個嵌入對象。
語法為:object.CreateEmbed sourcedoc[,class]
sourcedoc :必選項,對象從該文件中創建。
SourceItem :可選項,文件內的被鏈接的數據。
l DoVerb方法
打開一個對象(例如編輯一個對象)。
Object.DoVerb[verb]
Verb :可選項,在OLE容器控制項內要執行的對象的謂詞。
l InsertObjDlg方法
顯示插入對象對話框。
語法為:object.InsertObjDlg
[說明](1)用戶在運行這個方法時,將顯示“插入對象”對話框,通過選取對象的類型,來創建鏈接的或內容嵌的對象,並由應用程序提供該對象。
(2)創建新對象時,與類名(如Excel.EXE)關聯的應用程序,必須已在操作系統中正確地作了註冊。
l PasteSpecialDlg方法
顯示“特殊粘貼”對話框。
語法為:object.PasteSpecialDlg
l Updated事件
當一個已創建對象的數據發生改變(修改)時,會引發Updated事件。
l ObjectMove事件
當移動和OLE控制項有關的對象以及調整其大小時,會觸發ObjectMove事件。
l UpdateOptions屬性
在運行時設置當鏈接數據修改後是否更新鏈接對象。
語法為:Object.UpdateOptions [=number]
其中Number的設置值為:
0 —— 自動的(預設值),每次改變鏈接數據時均更新對象
1 —— 凍結的
2 —— 手動的,只有使用Update方法才更新對象
2、運行階段建立鏈接對象
舉例:(1)在窗體上添加2個OLE容器控制項時,2個命令按鈕。
(2)設計代碼:
☆ 要求功能:①OLE1和OLE2鏈接同一個數據源。
②當改變(修改)OLE1容器控制項中的鏈接數據時,OLE控制項中鏈接同一個數據源的數據也要求跟著變化。
Private sub command1_click( )
OLE1.class=”Excel worksheet”用”Excel.sheet.&”也可以
OLE1.sourceDoc=”C:\My Documents\aa.xls”
OLE1.DrsplayType=0
OLE1.Action=1
OLE2.class=”Excelworksheet”
OLE2.sourceDoc=”C:\My Documents\aa.xls”
OLE2.DisplayType=0
OLE2.Action=1
End sub
Private sub command2_click( )
UnLoad Me
End sub
Private sub OLE1_Updated(code as integer)
OLE2.UpdateOptions=0 ‘用OLE2.Action=6也可以,或OLE2.Update方法也可以
End sub
Private sub OLE2_Updated(code as integer)
OLE1.UpdateOptions=0
End sub
3、運行階段建立嵌入對象
運行時建立嵌入對象的方法與建立鏈接對象的方法相似,只不過此時在有關代碼中用:
OLE1.Action=0 或使用 CreateEmbed方法。
[注意]:對嵌入對象的任何修改要保存的話,一定要使用前述的SaveToFile方法,將修改的數據保存至某個文件中,在需要的時候可打開文件並恢復修改的內容。
補充2:
應用OLE拖放(在你的VB應用程序中支持OLE拖動功能)
一、OLE拖放的含義
指將數據從一個控制項或應用程序移動到另一個控制項或應用程序。
例如:可先選定並拖動Excel中的一列單元,然後將它們放到VB應用程序的DataGrid控制項上。
二、VB控制項的OLE拖放功能
VB的幾乎所有控制項都在某種程度上支持OLE拖放(專業版和企業版)。
1、自動支持OLE拖放的控制項(既可從控制項拖出,也可在控制項放入)。
DataGrid , PictureBox ,RichTextBox ,Image ,TextBox ,MaskedEditBox
[注意]:要啟動這些控制項的自動OLE拖放功能,應將其OLE Drag Mode屬性和OLEDropMode屬性設置為“自動化”——“Automatic“
2、僅自動支持OLE拖動操作的控制項(僅從控制項拖出)。
ComboBox ,DataListBox ,FileListBox ,DataComboBox ,DirlistBox ,ListBox , TreeView ,ListView等。
[注意]:要啟動這些控制項的自動拖動功能,應將其OLEDragMode設置“自動化”。
3、僅支持OLE拖放事件的控制項
——即可代碼對它們編程,使之成為OLE拖放操作的源,也可使生成為OLE拖放操作的目標。
CheckBox , Frame , OptionButton , CommandButton , Label , DrivelistBox , Data等。
[注意]:(1)為判斷其它ActionX控制項是否支持OLE拖放,應在VB在載入控制項,並檢查OLEDragMode和OLEDropMode屬性是否存在或檢查OLEDrag方法是否存在。
(2)預設規定:在將文本從文本框控制項拖動到word文檔時,文本被移動;若拖動文本的同時按下[Ctrl]鍵,則文本被複制。