【PB】oleobject 的具體用法和作用

文章轉自:https://blog.csdn.net/iko2008/article/details/5342464

OLE自動化是不同應用程序之間進行通訊的一個標準。OLE自動化的工作方式是:通訊被動方(OLE服務器)應用程序向通訊主動方(OLE客戶機)應用程序提供一個以上可供其調用的OLE自動化對象類型,OLE客戶機通過引用這些對象實現對OLE服務器的調用,然後通過設置對象的屬性和使用對象的方法操縱OLE服務器應用程序,完成兩者之間的通訊。       
  Powerbuilder7.0

  Powerbuilder7.0是一個完全支持OLE自動化的應用程序開發工具。使用POWERBUILDER7.0,既可以編制做爲OLE服務器的應用程序,也可以編制作爲OLE客戶機的應用程序。Word2000是一個不完全支持OLE自動化的應用軟件,它只能作爲OLE服務器供其它應用程序調用。本文將以一個POWERBUILDER7.0應用程序通過OLE自動化操縱Word2000的實例,具體描述在POWERBUILDER7.0中操縱OLE服務器應用程序的方法。       
  
POWERBUILDER7.0代碼中調用OLE服務器的方法如下:       
  
1   聲明一個對象變量:     
  OLEObject   wordapp       
  
2)使用Create語句創建該對象,其語法如下:       
  wordApp   =   Create   OLEObject     
  
3)根據自己使用OLE服務器的對象類型,利用ConnectToNewObjectstring   aparam)函數建立連接,根據返回參數判斷OLE服務器連接是否成功,參數aparam表示所連接的服務器類型,對於office2000套件中的應用程序提供如下幾種常用的服務器標識:     
  "Word.Application"     
  "Word.Document"     
  "Excel.Application"     
  "Excel.Worksheet"     
  
對於word分兩種,一種是創建面向應用程序的服務器對象"Word.Application",另一個是創建單個文檔的服務器對象"Word.Document",二者的區別在於使用的範圍不同,本文我們創建面向應用程序的服務器對象,代碼實現如下:     
  int   ret     
  //   
連接"   word.application   "服務器,同時判斷連接是否成功     
  ret   =   wordApp.ConnectToNewObject(   "word.application"   )     
  if   ret   <   0   then     
  MessageBox("
信息提示","你的WORD無法正常運行,請重新安裝!")     
  return     
  end   if     
      
  
4)通過設置對象的屬性和使用對象的方法,實現對OLE服務器的操縱。       
  
對象類型採用Word宏語言WordBasic的大多數語句和函數作爲它的方法。也就是說,一旦在POWERBUILDER7.0中創建了一個Word服務器對象,就可以通過該對象使用大多數WordBasic語句或函數,從而可以近乎完美地操縱WordWord文檔。例   如,下列語句在POWERBUILDER7.0代碼中使用WordBasicFileNewDefault語句創建一個Word新文檔:       
  wordApp.Application.FileNewDefault
file_name       
  
5)調用結束後,使用關鍵字的destroy,釋放該變量佔用的資源。如:     
  destroy   wordapp       
  
實例       
  
本例將使用POWERBUILDER7.0編寫一個簡單的數據庫應用程序。該程序從數據庫中取出數據,然後通過OLE自動化將這些數據輸入至Word,並按照Word的排版格式編排成一個表格。例中使用的數據庫是POWERBUILDER7.0自含的EAS   Demo   DB   V3.db數據庫,數據檢索結果取自examples數據表。本例稍加改動,即可作爲數據庫應用程序的報表生成功能模塊使用。       
  
首先,創建一個名爲pbtoword的應用,在該應用中的open事件中添加數據庫連接代碼如下:     
  SQLCA.DBMS   =   "ODBC"     
  SQLCA.Database   =   "EAS   Demo   DB   V3"     
  SQLCA.AutoCommit   =   False     
  SQLCA.DBParm   =   "ConnectString='DSN=EAS   Demo   DB   V3;UID=dba;PWD=sql'"     
  connect;     
  
創建窗口w_main,設置其標題title   屬性爲“word_OLE自動化演示程序。然後在該窗體中加入三個控件:數據窗口dw_1開始數據填寫按鈕cb_start程序結束按鈕cb_end並設置有關屬性,完成上述工作後,點擊窗口預覽運行菜單,屏幕布局應如下圖示。     
      
  
接着需要編寫POWERBUILDER7.0代碼來實現與Word的連接。本實例的代碼清單如下(注:代碼中wordapp使用得語句WordBasic宏語言的語句,這些語句的使用方法請參閱WordBasic宏語言有關資料,或直接再word中查看visual   basic編輯環境中的對象瀏覽器):       
  
1)在w_mainopen事件中加入數據窗口的數據連接代碼:       
  dw_1.settransobject(sqlca)     
  dw_1.retrieve()       
  
2)命令按鈕   cb_start   鼠標單擊事件代碼,該事件使用WordBasic宏語言在Word2000中製作一個表格,並將當前數據數據窗口中的數據依次插入表格單元。      
  constant   integer   ppLayoutBlank   =   12     
  OLEObject   wordapp     
  wordapp   =   CREATE   OLEObject     
      
  int   ret     
  //   
連接"   word.application   "服務器,同時判斷連接是否成功     
  ret   =   wordApp.ConnectToNewObject(   "word.application"   )     
  if   ret   <   0   then     
  MessageBox("
信息提示","你的WORD無法正常運行,請重新安裝!")     
  return     
  end   if     
  word.application.ScreenUpdating()     
  wordapp.Visible   =   True   //
使得word2000的使用過程可見     
      
  long   ll_colnum,ll_rownum     
  constant   long   wdWord9TableBehavior   =   1     
  constant   long   wdAutoFitFixed   =   0     
  constant   long   wdCell   =   12     
  string   ls_value     
      
  //
得到數據窗口數據的列數與行數(行數應該是數據行數   +   1     
  ll_colnum   =   Long(dw_1.object.datawindow.column.count)     
  ll_rownum   =   dw_1.rowcount()   +   1     
      
  wordapp.Documents.Add("C:/WINDOWS/Application   Data/Microsoft/Templates/Normal.dot",False,0)     
  wordapp.ActiveDocument.Tables.Add(wordapp.Selection.Range,   ll_rownum,   ll_colnum,wdWord9TableBehavior,wdAutoFitFixed)     
      
  string   ls_colname     
  integer   i,j     
  for   i   =   1   to   ll_colnum     
  //
得到標題頭的名字     
  ls_colname   =   dw_1.describe('#'   +   string(i)   +   ".name")   +   "_t"     
  ls_value   =   dw_1.describe(ls_colname   +   ".text")     
  wordapp.Selection.TypeText(trim(ls_value))     
  wordapp.Selection.MoveRight(wdCell)     
  next     
      
  dw_1.setredraw(false)     
  wordapp.Selection.MoveLeft(wdCell)     
  for   i   =   2   to   ll_rownum     
  for   j   =   1   to   ll_colnum     
  dw_1.scrolltorow(i   -   1)     
  dw_1.setcolumn(j)     
  ls_value   =   dw_1.gettext()     
  wordapp.Selection.MoveRight(wdCell)     
  wordapp.Selection.TypeText(ls_value)     
  next     
  next     
  dw_1.setredraw(true)     
      
  constant   long   wdFormatDocument   =   0     
  //
保存新建的文檔     
  wordapp.ActiveDocument.SaveAs("sample.doc",   0,False,"",True,"",False,False,False,   False,False)     
      
  //
打印該word文檔     
  wordApp.Application.printout()     
      
  //
斷開OLE連接,釋放wordapp對象     
  destroy   wordapp     
  
3)命令按鈕   cb_end   鼠標單擊事件代碼       
  close(parent)     
  
幾點說明       
  
在本程序運行之前,Word2000必須已經成功安裝,否則系統將產生一個POWERBUILDER7.0可捕獲的錯誤。讀者可以在代碼中加入錯誤處理代碼以處理這些錯誤。       
  
若本程序運行時Word尚未運行,OLE自動化將試圖啓動它。因此程序代碼中不必包括一條分開的指令來啓動Word。若Word是由POWERBUILDER7.0應用程序啓動的,那麼程序結束時Word2000將自動關閉;否則,Word將繼續運行。       
  
本實例使用的大部分WordBasic語句都與Word2000文檔的插入點有關,如果在本程序運行過程中人爲地移動了插入點,則有可能導致表格的混亂和錯誤。爲了避免這種情況發生,本程序在執行插入操作之前使用ScreenUpdating語句將Word屏幕更新關閉,使用戶在執行插入操作時不能移動插入點。       
  
從上述實例可以看到,通過OLE自動化,使我們在開發新的應用程序時可以借用現成的應用程序的部分或全部功能,從而大大地減輕開發的工作量,縮短開發週期,使開發工作事半功倍。這就是OLE自動化帶給開發人員的好處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章