【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 服务器的对象类型,利用 ConnectToNewObject string   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 语句或函数,从而可以近乎完美地操纵 Word Word 文档。例     如,下列语句在 POWERBUILDER7.0 代码中使用 WordBasic FileNewDefault 语句创建一个 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_main open 事件中加入数据窗口的数据连接代码:        
  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 自动化带给开发人员的好处。

你可能感兴趣的:(pb实例,pb知识库)