VFPOLE技术及应用

杨竞

  一、VFPOLE技术概述

  VisualFoxPro3.0(以下简称VFP)使用了OLE2.0技
术,使VFP应用程序的适应能力大为加强。

  VFP提供两种类型的OLE对象:一种是OLE控件(.OCX
文件),这是一种自定义控件,通常在WINDOWSιSYSTEM
目录下,拥有自己的事件、方法,类似于VFP的基本类,这
种控件可以用VC、VB5.0、Delphi、SDK2.0等编程工具
开发。VFP缺省提供了四种可供使用的OLE控件,即通信(M
SCOMM32.OCX)、消息应用程序接口MAPI(MSMAPI32.OC
X)、Outline(MSOUTL32.OCX)和图片裁剪(PICCLP32
.OCX);另一种是可插入型OLE对象,这是由其他应用程
序创建的,它们没有自己的事件集合。这一种可插入型OLE
对象又可分为限制性可插入型OLE对象和非限制性可插入
型OLE对象。

  VFP提供两种引用OLE对象的途径都是通过VFP中的控
件实现的:一种是通过OLE容器控件链接或嵌入对象,OLE
容器控件可以引入OLE控件和非限制性可插入型OLE对象;
另一种是通过OLE绑定型控件链接或嵌入数据表的通用类型
字段中所存放的OLE对象,这通常是些限制性可插入型OLE
对象。

  在VFP中OLE对象是通过链接或嵌入操作方式进行操作
的。链接和嵌入操作之间的区别在于OLE对象所存放的地
点:链接操作中的OLE对象仍然存放在创建它的源文件中数
据表或表单仅仅存储源文件的位置,即一个指针,在更改
源文件时,被链接的OLE对象将被及时更新。被链接的OLE
对象始终保持着与源文件之间的联系,除非人为断开这种
联系;嵌入操作的OLE对象只能存储在数据表或表单中。
这些OLE对象不与创建它的源文件保持联系。如果源文件做
了更改,它们不会自动反映在VFP应用程序中,除非你再
次进行嵌入操作。链接操作通常用于如下场合:OLE对象(
数据或图形)可能被经常更改、应用程序必须包含最新版
本的OLE对象、存放OLE对象的源文件可以在计算机之间或
通过计算机网络进行更新、存放OLE对象的源文件必须被
其他应用程序共享。嵌入操作通常用于如下场合:应用程
序不需要具有最新版本的OLE对象、嵌入的OLE对象不需要
被多个应用程序使用、源文件在被链接后不会被更新。

  要注意的是VFP本身只是一个OLE客户机,而不是一个
OLE服务器。

  使用OLE对象

  在应用程序中使用OLE对象首先要考虑OLE对象的类型
,针对不同类型的OLE对象,使用不同的方法来引用它们
。当程序中要引用的可插入型OLE对象较多时就要考虑用数
据表的通用型字段来存储它。

  1、在VFP的数据表中添加OLE对象方法一:使用数据
表设计器给数据表添加一个通用型字段,然后将可插入型O
LE对象链接或嵌入到通用型字段的每个记录中。通用字段
包含一个10字节的指针,它指向该字段真正的内容,通用
型字段的真正类型和数据大小取决于创建这些对象的OLE
服务器。这些OLE对象是以链接方式还是以嵌入方式进行操
作与该应用程序有关。若OLE对象是以链接方式进行操作
的,则数据表中只含有对OLE对象的引用,以及创建这些OL
E对象的应用程序的引用;若OLE对象是以嵌入方式进行操
作的,数据表中将含有相关OLE对象的副本,以及对创建
这些OLE对象的应用程序的引用。通用字段的大小仅受可用
磁盘空间的限制。

  方法二:使用APPENDGENERAL命令从文件中导入OLE对
象并将其放入通用型字段中。语法:

  APPENDGENERALGeneralFieldName

  [FROMFileName FROMMEMOPictureFieldName]

  [DATAcExpression]

  [LINK]

  [CLASSOLEClassName]

  2、使用限制性可插入型OLE对象

  使用通用型字段中所存储的限制性可插入型OLE对象
需要使用OLE绑定型控件,步骤如下:

  (1)在表单设计器中,将一个OLE绑定型控件添加到
表单中。

  (2)通过设置对象的ControlSource属性指定包含OL
E对象的通用型字段。如果数据表名为Inventory,通用型
字段名为Current,那么可以将ControlSource属性设置
成Inventory.Current。

  (3)在表单上添加按钮或菜单命令,用以浏览Contr
olSource属性指定的通用型字段。

  3、使用OLE控件(.OCX文件)及非限制性可插入型O
LE对象

  这两类对象需要使用OLE容器控件。OLE容器控件允许
向应用程序中加入OLE对象,包括OLE控件(.OCX文件)
、非限制性可插入型OLE对象。OLE容器控件与OLE绑定型控
件不同在于,它不与VFP表的一个通用型字段相连接。

  若要在表单中添加OLE控件及非限制性可插入型OLE对
象可按如下步骤进行:

  (1)在表单设计器中,向表单中添加一个OLE容器控
件。

  (2)在“InsertObject”对话框中,选择“CreateN
ew”或“CreatefromFile”或“InsertControl”选项。

  (3)从显示的列表中选择适当的OLE控件或创建适当
类型的对象或增加一个嵌入文件。

  在插入控件时如果所要的控件没有出现在列表中,可
选择“AddControl”按钮将其添加到列表中。也可以通过
将OLE控件添加到表单控件工具栏中而将其添加到表单中
。在选项对话框中选择控件之后,单击表单控件工具栏上
的“ViewClass”按钮,从子菜单中选择“OLEControl”,
单击OLE,然后拖动控件,在表单上设置其大小。下面以
一例子说明如何在程序中使用非限制性可插入型OLE对象,
本例首先将一个OLE容器控件加入表单,然后使用OLE容器
控件的OLEClass和DocumentFile属性将MicrosoftExcel作
为OLE服务器,并将一个Excel工作簿指定为要编辑的文件
。DocumentFile属性指定了在C驱动器中Excel路径下一个
名为BOOK1.XLS的工作簿。如果在DocumentFile属性中指
定的文件或路径不存在,则本例程不能正常运行,这时需
要修改DocumentFile来指明一个存在的路径和工作簿文件
。另外BOOK1.XLS只能读不能修改,下面是其VFP源代码
及其说明。

  frmMyForm=CREATEOBJECT(′Form′)&&创建表单


  frmMyForm.Closable=.F.&&废止控制菜单框

  frmMyForm.AddObject(′cmdCommand1′,′cmdMy
CmdBtn′)

  frmMyForm.AddObject(″oleObject″,″oleEx
celObject″)

  frmMyForm.cmdCommand1.Visible=.T.

  frmMyForm.oleObject.Visible=.T.

  frmMyForm.oleObject.Height=50

  frmMyForm.Show

  frmMyForm.oleObject.DoVerb(-1)

  READEVENTS

  DEFINECLASSoleExcelObjectasOLEControl

  OleClass=″Excel.Sheet″

  DocumentFile=″C:ιEXCELιBOOK1.XLS″

  ENDDEFINE

  DEFINECLASScmdMyCmdBtnASCommandButton

  Caption=′ιΙQuit′

  Cancel=.T.

  Left=125

  Top=210

  Height=25

  PROCEDUREClick

  CLEAREVENTS

  ENDDEFINE

  4、使用OLE对象的属性

  OLE对象有一系列属性可供使用,但是对包含在OLE容
器控件中的OLE对象,要确保引用的是OLE对象的属性而不
是其容器的属性,这需要将容器的Object属性加到OLE
对象名当中。

  5、使用OLE对象的方法

  除了设置和读取OLE对象的属性外,还可以使用OLE对
象的方法来操作OLE对象。例如,下面的程序使用了Exc
el对象的Add方法来创建Excel工作簿,然后使用Save方法
保存该工作簿,并使用Quit方法结束Excel的本次运行:

  oleApp=CREATEOBJECT("Excel.Application"


  oleApp.Visible=.T.

  oleApp.Workbooks.Add

  oleApp.Cells(1,1).Value=7

  oleApp.ActiveWorkbook.SaveAs("C:ιTEMP.X
LS")

  oleApp.Quit

  与使用属性一样,如果用容器控件创建对象,应确保
将“Object”加到引用对象方法的控件名称当中。

  6、访问集合中的OLE对象

  一个对象类型可以代表单个对象或若干相关对象的集
合。

  在程序中,集合是一个未经排序的链表结构,每当有
对象被添加到集合中或从集合中移去时,其余对象的位置
都可能改变。使用集合的Count属性对集合遍历,可以访
问集合中的所有对象。Count属性可用来返回集合中项的数
目。另外,可以使用Item方法返回集合中的某一项。

  也可以访问集合内的集合。例如,使用下列程序代码
可以在一个单元格区域内访问某一单元格集合:

  oleApp=CREATEOBJECT("Ex
cel.sheet")

  oleApp.Range(oleApp.Cel
ls(1,1),oleApp.Cells(10,1
0)).Value=100

  7、使用OLE对象的数组利用OLE技术,不但可
以将数组传递给OLE对象的方法,而且可以接收OLE
对象传来的数组。传递数组的方式必须是按引用传递,即
必须在数组名前加@符号(用VFP不能将二维以上的数
组传递到OLE对象中)。例如,要发送一个VFP数组
到Excel中,可以使用以下程序代码。它先在VFP
中创建一个数组,给数组赋一些值,然后启动Excel
,创建一个工作簿,并给工作表的第一个单元格设置一个
初始值,再将此值复制到数组中的其他工作表中:其中用
到了Excel的工作簿集(Workbooks对象)
,工作表集(Sheets对象)的相关属性及方法和E
xcel对象的GetCustomListConte
nts方法。下列代码将数组传递给方法FillAcr
ossSheets,以便将Sheet1中的第一区域
内容复制到其它工作表的相同区域。

  DIMENSIONaV(2)

  aV(1)=″Sheet1″

  aV(2)=″Sheet2″

  oleApp=CREATEOBJECT(″Ex
cel.Application″)

  oleApp.Workbooks.Add

  oleI=oleApp.Workbooks.I
tem(1)

  oleI.Sheets.Item(1).Cel
ls(1,1).Value=100&&初始值

  oleI.Sheets(@aV).FillAc
rossSheets(oleI.Worksheet
s(″Sheet1″).Cells(1,1))

  oleApp.Visible=.T.

  下列代码将一个数组返回到VFP,并显示数组的内
容:

  oleApp=CREATEOBJECT(″Ex
cel.Application″)

  aOleArray=oleApp.GetCus
tomListContents(1)&&改变数组下
标可以显示其它内容

  FORnIndex=1toALEN(aOleA
rray)

  ?aOleArray(nIndex)

  ENDFOR

back.gif (1185 字节)