程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 在VB中操縱OLE服務器應用程序

在VB中操縱OLE服務器應用程序

編輯:VB綜合教程
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自動化帶給開發人員的好處。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved