在VB中操縱OLE服務器應用程序
發表于:2007-07-14來源:作者:點擊數:
標簽:
OLE自動化是不同應用程序之間進行通訊的一個標準。OLE自動化的工作方式是:通訊被動方(OLE 服務器 )應用程序向通訊主動方(OLE客戶機)應用程序提供一個以上可供其調用的OLE自動化對象類型,OLE客戶機通過引用這些對象實現對OLE服務器的調用,然后通過設置
OLE自動化是不同應用程序之間進行通訊的一個標準。OLE自動化的工作方式是:通訊被動方(OLE
服務器)應用程序向通訊主動方(OLE客戶機)應用程序提供一個以上可供其調用的OLE自動化對象類型,OLE客戶機通過引用這些對象實現對OLE服務器的調用,然后通過設置對象的屬性和使用對象的方法操縱OLE服務器應用程序,完成兩者之間的通訊。
Visual Basic是一個完全支持OLE自動化的應用程序
開發工具。使用
VB,既可以編制做為OLE服務器的應用程序,也可以編制作為OLE客戶機的應用程序。MS Word 6.0是一個不完全支持OLE自動化的應用軟件,它只能作為OLE服務器供其它應用程序調用。本文將以一個VB應用程序通過OLE自動化操縱MS Word 6.0的實例,具體描述在VB中操縱OLE服務器應用程序的方法。
在VB代碼中調用OLE服務器的方法如下:控件類型 屬性 屬性值 Data Control DataBaseNameName C:\VB\BIBLIO.MDBData1 RecordSource Authors DBGrid ControlCommandButton Control DataSource Data1 Name cmdReport Caption 生成報表 CommandButton Control Name cmdExit Caption 退出
⑴聲明一個對象變量。如:Dim MS—WORD As Object
⑵根據OLE服務器提供的對象類型,使用CreateObject函數創建一個對象,并由Set語句將該對象賦予對象變量。
CreateObject函數的語法如下:
CreateObject(class)
函數參數class的格式為:appname.objecttype
appname是提供對象的應用程序的名稱,如:Word
objecttype是欲創建的對象的類,如:Basic
MS Word 6.0為OLE客戶機應用程序提供了一個類型為“basic”的對象,VB可以使用該對象類型,實現對Word的調用。具體語句如下:
Set MS—WORD = CreateObject(″Word.Basic″)
⑶通過設置對象的屬性和使用對象的方法,實現對OLE服務器的操縱。
對象類型“basic”采用Word宏語言WordBasic的大多數語句和函數作為它的方法。也就是說,一旦在VB中創建了一個“basic”對象,就可以通過該對象使用大多數WordBasic語句或函數,從而可以近乎完美地操縱Word或Word文檔。例如,下列語句在VB代碼中使用WordBasic的FileNewDefault語句創建一個Word新文檔:
MS—WORD.FileNewDefault
⑷調用結束后,使用關鍵字Nothing,釋放該變量占用的資源。如:Set MS—WORD = Nothing
實例
本例將使用VB編寫一個簡單的
數據庫應用程序。該程序從數據庫中取出數據,然后通過OLE自動化將這些數據輸入至Word,并按照Word的排版格式編排成一個表格。例中使用的數據庫是VB自含的BILIO.MDB數據庫,數據檢索結果取自Authors數據表。本例稍加改動,即可作為數據庫應用程序的報表生成功能模塊使用。
首先,創建一個名為Form1的窗體,設置其Caption 屬性為“OLE自動化演示”。然后在該窗體中加入四個控件并設置有關屬性,具體如下:
完成上述工作后,按F5運行的屏幕布局應如下圖示。
接著需要編寫VB代碼來實現與Word的連接。本實例的代碼清單如下(注:代碼中的斜體部分是WordBasic宏語言的語句,這些語句的使用方法請參閱WordBasic宏語言有關資料):
⑴在Form1的General Declarations部分聲明窗體級全局變量和常量。
Dim MS—WORD As Object '聲明一個對象變量
Const MaxCols = 5 '聲明一個用于標明當前數據記錄集中字段個數的常量。在本例中字段個數為5
⑵創建一個子例程InsertTableIntoMS—Word(),該子例程使用WordBasic宏語言在Word 6.0中制作一個表格,并將當前數據記錄集中的數據依次插入表格單元。
Sub InsertTableIntoMS—Word()
Dim i As Integer, j As Integer, Col As Integer, Row As Integer
Dim CellContent As String
Me.Hide
Col = MaxCols
Row = Data1.Recordset.RecordCount
MS—WORD.FileNewDefault
MS—WORD.MsgBox ″正在建立報表,請稍候…″, ″″, -1
MS—WORD.LeftPara
MS—WORD.ScreenUpdating 0
MS—WORD.TableInsertTable , Col, Row, , , 16, 167
MS—WORD.StartOfDocument
Data1.Recordset.MoveFirst
For i = 1 To MaxCols
CellContent$ = Data1.Recordset.Fields(i - 1).Name
MS—WORD.Insert CellContent$
MS—WORD.NextCell
Next i
Do
For i = 1 To MaxCols
If IsNull(Data1.Recordset.Fields(i - 1).Value) Then
CellContent$ = ″″
Else
CellContent$ = Data1.Recordset.Fields(i - 1).Value
End If
MS—WORD.Insert CellContent$
MS—WORD.NextCell
Next i
Data1.Recordset.MoveNext
Loop Until Data1.Recordset.EOF = True
MS—WORD.TableDeleteRow
MS—WORD.StartOfDocument
MS—WORD.TableSelectRow
MS—WORD.TableHeadings 1
MS—WORD.CenterPara
MS—WORD.StartOfDocument
MS—WORD.ScreenRefresh
MS—WORD.ScreenUpdating 1
MS—WORD.MsgBox ″結束″, ″″, -1
Me.Show
End Sub
⑶命令按鈕控件cmdReport的鼠標單擊事件代碼
Private Sub cmdReport—Click()
Dim Response
Screen.MousePointer = 11
Set MS—WORD = CreateObject(″Word.Basic″)
MS—WORD.AppActivate ″Microsoft Word″, 1
Call InsertTableIntoMS—Word
Screen.MousePointer = 0
End Sub
⑷命令按鈕控件cmdExit的鼠標單擊事件代碼
Private Sub cmdExit—Click()
Set MS—WORD = Nothing
Unload Me
End Sub
幾點說明
①在本程序運行之前,Word 6.0必須已經成功安裝,否則系統將產生一個VB可捕獲的錯誤。Word 6.0的表格列不能超過31列,否則系統將產生一個VB可捕獲的錯誤。讀者可以在代碼中加入錯誤處理代碼以處理這些錯誤。
②若本程序運行時Word尚未運行,OLE自動化將試圖啟動它。因此程序代碼中不必包括一條分開的指令來啟動Word。若Word是由VB應用程序啟動的,那么程序結束時Word將自動關閉;否則,Word將繼續運行。
③本實例使用的大部分WordBasic語句都與Word文檔的插入點有關,如果在本程序運行過程中人為地移動了插入點,則有可能導致表格的混亂和錯誤。為了避免這種情況發生,本程序在執行插入操作之前使用ScreenUpdating語句將Word屏幕更新關閉,使用戶在執行插入操作時不能移動插入點。
從上述實例可以看到,通過OLE自動化,使我們在開發新的應用程序時可以“借用”現成的應用程序的部分或全部功能,從而大大地減輕開發的工作量,縮短開發周期,使開發工作事半功倍。這就是OLE自動化帶給開發人員的好處。
原文轉自:http://www.anti-gravitydesign.com