- OLE自动化是不同应用程序之间进行通讯的一个标准。
- OLE自动化的工作方式是:通讯被动方(OLE服务器)应用程序向通讯主动方(OLE客户机)应用程序提供一个以上可供其调用的OLE自动化对象类型,OLE客户机通过引用这些对象实现对OLE服务器的调用,然后通过设置对象的属性和使用对象的方法操纵OLE服务器应用程序,完成两者之间的通讯。
- 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自动化带给开发人员的好处。
原文链接:https://blog.csdn.net/iko2008/article/details/5342464