OLE自動化是不同應用程序之間進行通訊的一個標准。OLE自動化的工作方式是:通訊被動方(OLE服務器)應用程序向通訊主動方(OLE客戶機)應用程序提供一個以上可供其調用的OLE自動化對象類型,OLE客戶機通過引用這些對象實現對OLE服務器的調用,然後通過設置對象的屬性和使用對象的方法操縱OLE服務器應用程序,完成兩者之間的通訊。
VisualBasic是一個完全支持OLE自動化的應用程序開發工具。使用VB,既可以編制做為OLE服務器的應用程序,也可以編制作為OLE客戶機的應用程序。MSWord6.0是一個不完全支持OLE自動化的應用軟件,它只能作為OLE服務器供其它應用程序調用。本文將以一個VB應用程序通過OLE自動化操縱MSWord6.0的實例,具體描述在VB中操縱OLE服務器應用程序的方法。
在VB代碼中調用OLE服務器的方法如下:控件類型屬性屬性值DataControlDataBaseNameNameC:VBBIBLIO.MDBData1RecordSourceAuthorsDBGridControlCommandButtonControlDataSourceData1NamecmdReportCaption生成報表CommandButtonControlNamecmdExitCaption退出
⑴聲明一個對象變量。如:DimMS—WORDAsObject
⑵根據OLE服務器提供的對象類型,使用CreateObject函數創建一個對象,並由Set語句將該對象賦予對象變量。
CreateObject函數的語法如下:
CreateObject(class)
函數參數class的格式為:appname.objecttype
appname是提供對象的應用程序的名稱,如:Word
objecttype是欲創建的對象的類,如:Basic
MSWord6.0為OLE客戶機應用程序提供了一個類型為“basic”的對象,VB可以使用該對象類型,實現對Word的調用。具體語句如下:
SetMS—WORD=CreateObject(″Word.Basic″)
⑶通過設置對象的屬性和使用對象的方法,實現對OLE服務器的操縱。
對象類型“basic”采用Word宏語言WordBasic的大多數語句和函數作為它的方法。也就是說,一旦在VB中創建了一個“basic”對象,就可以通過該對象使用大多數WordBasic語句或函數,從而可以近乎完美地操縱Word或Word文檔。例如,下列語句在VB代碼中使用WordBasic的FileNewDefault語句創建一個Word新文檔:
MS—WORD.FileNewDefault
⑷調用結束後,使用關鍵字Nothing,釋放該變量占用的資源。如:SetMS—WORD=Nothing
實例
本例將使用VB編寫一個簡單的數據庫應用程序。該程序從數據庫中取出數據,然後通過OLE自動化將這些數據輸入至Word,並按照Word的排版格式編排成一個表格。例中使用的數據庫是VB自含的BILIO.MDB數據庫,數據檢索結果取自Authors數據表。本例稍加改動,即可作為數據庫應用程序的報表生成功能模塊使用。
首先,創建一個名為Form1的窗體,設置其Caption屬性為“OLE自動化演示”。然後在該窗體中加入四個控件並設置有關屬性,具體如下:
完成上述工作後,按F5運行的屏幕布局應如下圖示。
接著需要編寫VB代碼來實現與Word的連接。本實例的代碼清單如下(注:代碼中的斜體部分是WordBasic宏語言的語句,這些語句的使用方法請參閱WordBasic宏語言有關資料):
⑴在Form1的GeneralDeclarations部分聲明窗體級全局變量和常量。
DimMS—WORDAsObject'聲明一個對象變量
ConstMaxCols=5'聲明一個用於標明當前數據記錄集中字段個數的常量。在本例中字段個數為5
⑵創建一個子例程InsertTableIntoMS—Word(),該子例程使用WordBasic宏語言在Word6.0中制作一個表格,並將當前數據記錄集中的數據依次插入表格單元。
SubInsertTableIntoMS—Word()
DimIAsInteger,jAsInteger,ColAsInteger,RowAsInteger
DimCellContentAsString
Me.Hide
Col=MaxCols
Row=Data1.Recordset.RecordCount
MS—WORD.FileNewDefault
MS—WORD.MsgBox″正在建立報表,請稍候…″,″″,-1
MS—WORD.LeftPara
MS—WORD.ScreenUpdating0
MS—WORD.TableInsertTable,Col,Row,,,16,167
MS—WORD.StartOfDocument
Data1.Recordset.MoveFirst
ForI=1ToMaxCols
CellContent$=Data1.Recordset.Fields(I-1).Name
MS—WORD.InsertCellContent$
MS—WORD.NextCell
NextI
Do
ForI=1ToMaxCols
IfIsNull(Data1.Recordset.Fields(I-1).Value)Then
CellContent$=″″
Else
CellContent$=Data1.Recordset.Fields(I-1).Value
EndIf
MS—WORD.InsertCellContent$
MS—WORD.NextCell
NextI
Data1.Recordset.MoveNext
LoopUntilData1.Recordset.EOF=True
MS—WORD.TableDeleteRow
MS—WORD.StartOfDocument
MS—WORD.TableSelectRow
MS—WORD.TableHeadings1
MS—WORD.CenterPara
MS—WORD.StartOfDocument
MS—WORD.ScreenRefresh
MS—WORD.ScreenUpdating1
MS—WORD.MsgBox″結束″,″″,-1
Me.Show
EndSub
⑶命令按鈕控件cmdReport的鼠標單擊事件代碼
PrivateSubcmdReport—Click()
DimResponse
Screen.MousePointer=11
SetMS—WORD=CreateObject(″Word.Basic″)
MS—WORD.AppActivate″MicrosoftWord″,1
CallInsertTableIntoMS—Word
Screen.MousePointer=0
EndSub
⑷命令按鈕控件cmdExit的鼠標單擊事件代碼
PrivateSubcmdExit—Click()
SetMS—WORD=Nothing
UnloadMe
EndSub
幾點說明
①在本程序運行之前,Word6.0必須已經成功安裝,否則系統將產生一個VB可捕獲的錯誤。Word6.0的表格列不能超過31列,否則系統將產生一個VB可捕獲的錯誤。讀者可以在代碼中加入錯誤處理代碼以處理這些錯誤。
②若本程序運行時Word尚未運行,OLE自動化將試圖啟動它。因此程序代碼中不必包括一條分開的指令來啟動Word。若Word是由VB應用程序啟動的,那麼程序結束時Word將自動關閉;否則,Word將繼續運行。
③本實例使用的大部分WordBasic語句都與Word文檔的插入點有關,如果在本程序運行過程中人為地移動了插入點,則有可能導致表格的混亂和錯誤。為了避免這種情況發生,本程序在執行插入操作之前使用ScreenUpdating語句將Word屏幕更新關閉,使用戶在執行插入操作時不能移動插入點。
從上述實例可以看到,通過OLE自動化,使我們在開發新的應用程序時可以“借用”現成的應用程序的部分或全部功能,從而大大地減輕開發的工作量,縮短開發周期,使開發工作事半功倍。這就是OLE自動化帶給開發人員的好處。->