荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: VFP中的OLE自动化与MS OFFICE的集成
发信站: BBS 荔园晨风站 (Wed Jan 27 17:47:31 1999), 转信


  微软公司曾宣布,它的所有基于Windows的产品连同Windows本身及
未来的版本都将基于OLE这种技术,进而使Windows成为一种集成性很
强的平台。本文将讨论OLE的自动化,并举例说明在VFP3.0(Visual Fo
xpro)中如何通过OLE自动化实现对微软Office应用的控制。
    OLE自动化最简单的说法是:一个应用程序控制另外一个应用程序
的过程,这可以通过创建一个OLE对象来实现。对象具有属性和方法,
属性允许设置对象的状态或其它数据条目的值,方法可以对某一对象
执行一个作用,诸如打印文件、计算等等。
    在微软新近推出的VFP3.0当中,增加了支持OLE自动化的功能,使V
FP开发的应用能够使用其他的应用程序去做更适合于该应用程序的工
作,其中最为突出的就是与微软的Office一起进行协同工作。
    使用OLE自动化一般需要经过几个步骤:首先基于某个服务器应用
程序在VFP中创建对象或者使用已经存在的对象;然后可以利用该应用
程序的方法对这个对象进行各种操作,这些方法经常是宏命令或者是
应用程序中的命令(如在EXCEL中的各种命令);最后还要释放OLE对象
的宿主应用程序,释放OLE对象。
     为了获取其他应用的对象,在VFP当中提供了两个函数用于创建
对象,一旦获得了某个对象就可以通过对象的属性和方法来操纵这个
对象。
    1.CREATEOBJECT()函数
    从一个支持OLE对象的应用程序中创建一个新对象,这个命令同样
也可以用于从Foxpro内部的或用户自定义的类中生成对象,在这里只
介绍OLE对象的生成。
    语法: <memvar>=CREATEOBJECT(cCLassName)。
    参数: cCLassName指定用来创建新对象的类或OLE对象,新对象将
从它那里生成。
    VFP将按照下面的顺序搜索类或者指定的OLE对象:
    · Visual Foxpro的基类;
    · 在内存中按加载顺序排列用户自定义的类;
    · 当前程序中的类;
    · 使用SET CLASSIB命令打开的在.VCX类库中的类;
    · 使用SET PROCEDURE命令打开的过程文件中的类;
    · 在Visual Foxpro程序执行链中的类;
    · Windows注册表(对于OLE对象而言)。
    对应于cCLassName的OLE对象用下列语法生成:
    ApplicationName.Class
    例如,要用OLE自动化生成一个MICROSOFT Word对象,可以用下列
语句:
    A1=CREATEOBJECT("WORD.BASIC")
    当这一行代码执行以后,Word就会被启动(这个例子是在Word还没
有运行的情况下), 同时创建了所指定的对象类型,但还未使Word可见
,(有一点需注意:如果Word已经在运行当中, 当执行这条命令时,它不
会创建一个新的分离的实例而是引用当前已经存在的实例;而EXCEL
则不同:如果对EXCEL使用三次CREATEOBJECT EXCEL就会启动运行三次
,即创建了三个不同的实例)。一旦对象被建立以后,就可以通过使用
定义的对象变量在代码中引用它。在上面的例子中,可以通过定义的A
1变量来访问这个新对象的属性和方法。例如:
     A1.Insert ("HELLO WORD。")
     A1.FILEPRINTDEFAULT

    2.GETOBJECT()函数
    激活一个已经存在的OLE自动化对象(并建立对这个对象的引用)

    语法:GETOBJECT([cFILENAME[,cCLASSNAME])。
    参数:cFILENAME指定了要激活文件的完整路径和文件名。
     cCLASSNAME是要检索对象的类名(在这里要说明一点,cCLASSNAM
E并不需要被设定,因为OLE的动态链接库会根据所提供的文件名决定
需要启动的应用)。
    例如,下面的代码启动了EXCEL,打开了一个叫MYSHEET.CLS的文件
,生成了一个引用,并把它存储到一个对象内存变量MYCLS中:
     Mycls=GETOBJECT("C:\EXCEL\WORK\MYSHEET.CLS")
    3.举例
    下面举例说明利用VFP的OLE自动化与MS Office的结合应用。这
个例子说明利用OLE自动化将从VFP中选择出来的数据插入EXCEL电子
表格当中,并显示统计的数据图表,同时在Word中显示本篇文章(A:\OL
E.DOC),同时打印出这篇文章。
    进入VFP建立新的表单,在上面加入COMMANDBUTTON控件,将其CAPT
ION的属性改为"OLE自动化",然后用鼠标双击按钮并在代码窗口中键
入:
    *****程序代码
    #DEFINE WAITMSG0_LOC "请按任意键继续进行"
    #DEFINE WAITMSG1_LOC "正在执行查询…"
    #DEFINE WAITMSG2_LOC "创建 Excel 表单…"
    #DEFINE WAITMSG3_LOC "将查询信息输入到EXCEL电子表格中…"
    #DEFINE WAITMSG4_LOC "正在创建 Graph 对象..."
    #DEFINE WAITMSG5_LOC "创建Graph..."
    #DEFINE WAITMSG6_LOC "创建 Word 文本..."
    #DEFINE WAITMSG7_LOC "完成!"
    PUBLIC objwddoc
    str= "利用VFP中的OLE自动化来控制微软Office的应用"
    wait wind WAITMSG1_LOC nowait
    SELECT name,age FROM al  INTO array cust_distrib
    wait wind WAITMSG0_LOC
    wait wind WAITMSG2_LOC nowait
    objsheet=crea("Excel.Sheet") ****创建对象OBJSHEET
    objsheet.application.visible=.T. ****使工作表可见
    Wait wind WAITMSG3_LOC nowait
    *** 拷贝数据到EXCEL中
    for i = 1 to _TALLY
    objsheet.Cells(i,1).Value = cust_distrib(i,1)
    objsheet.Cells(i,2).Value = cust_distrib(i,2)
    endfor
    Wait wind WAITMSG4_LOC nowait
    *** 增加一个图形对象到工作表中去
    objChart1 = objsheet.ChartObjects.Add(100, 100, 200, 200
)
    ***建立图型.
    Wait wind WAITMSG5_LOC nowait
    objsheet.chartobjects(1).chart.;
    chartwizard(objsheet.range(objsheet.cells(1,1),objsheet.
cells(10,2)),-4100, 4,1,0,1,1,"","","","")
    objXLsheet.application.quit **关闭EXCEL
    release objsheet  **释放OBJSHEET对象
    Wait wind WAITMSG6_LOC nowait
    objWDdoc=crea("word.basic")
    objwddoc.fileopen("a:\ole.doc") **打开A盘上的OLE.DOC文件
    objwddoc.editgoto("biaoti")  **编辑名为"BIAOTI"的书签,在
本例中的OLE.DOC中的第一行定义书签BIAOTIobjwddoc.insert (str)
**用STR代替书签当前的内容
    objwddoc.fileprintdefault**打印这个文件
    Wait Wind WAITMSG7_LOC nowait
    release objwddoc
    以上只是一个简单的例子,用以说明Visual Foxpro中OLE自动化
。关于OLE自动化最困难的事情是学习命令所需的语法,以便在VFP中
可以使用这些命令。大多数的情况下,所描述的语法和参数都包含在
服务器的文档中,用户可以在其中进行查阅并在程序中使用它。
    还要注意的问题是OLE自动化的资源密集性。在写OLE自动化的程
序时,内存是很重要的因素,内存越大同时运行的程序越多。一般要求
机器具备16MB内存和高性能的486以上处理器或更高。

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店