VFP用了OLE2.0技術(shù),使VFP應(yīng)用程序的適應(yīng)能力大為加強(qiáng)。 VFP提供兩種類(lèi)型的OLE對(duì)象:一種是OLE控件(.OCX文件),這是一種自定義控件,通常在WINDOWS/SYSTEM目錄下,擁有自己的事件、方法,類(lèi)似于VFP的基本類(lèi),這種控件可以用VC、VB5.0、DeLphi、SDK2.0等編程工具開(kāi)發(fā)。VFP缺省提供了四種可供使用的OLE控件,即通信(MSCOMM32.OCX)、消息應(yīng)用程序接口MAPI(MSMAPI32.OCX)、OutLine(MSOUTL32.OCX)和圖片裁剪(PICCLP32.OCX);另一種是可插入型OLE對(duì)象,這是由其他應(yīng)用程序創(chuàng)建的,它們沒(méi)有自己的事件集合。這一種可插入型OLE對(duì)象又可分為限制性可插入型OLE對(duì)象和非限制性可插入型OLE對(duì)象。 VFP提供兩種引用OLE對(duì)象的途徑都是通過(guò)VFP中的控件實(shí)現(xiàn)的:一種是通過(guò)OLE容器控件鏈接或嵌入對(duì)象,OLE容器控件可以引入OLE控件和非限制性可插入型OLE對(duì)象;另一種是通過(guò)OLE綁定型控件鏈接或嵌入數(shù)據(jù)表的通用類(lèi)型字段中所存放的OLE對(duì)象,這通常是些限制性可插入型OLE對(duì)象。 在VFP中OLE對(duì)象是通過(guò)鏈接或嵌入操作方式進(jìn)行操作的。鏈接和嵌入操作之間的區(qū)別在于OLE對(duì)象所存放的地點(diǎn):鏈接操作中的OLE對(duì)象仍然存放在創(chuàng)建它的源文件中數(shù)據(jù)表或表單僅僅存儲(chǔ)源文件的位置,即一個(gè)指針,在更改源文件時(shí),被鏈接的OLE對(duì)象將被及時(shí)更新。被鏈接的OLE對(duì)象始終保持著與源文件之間的聯(lián)系,除非人為斷開(kāi)這種聯(lián)系;嵌入操作的OLE對(duì)象只能存儲(chǔ)在數(shù)據(jù)表或表單中。這些OLE對(duì)象不與創(chuàng)建它的源文件保持聯(lián)系。如果源文件做了更改,它們不會(huì)自動(dòng)反映在VFP應(yīng)用程序中,除非你再次進(jìn)行嵌入操作。鏈接操作通常用于如下場(chǎng)合:OLE對(duì)象(數(shù)據(jù)或圖形)可能被經(jīng)常更改、應(yīng)用程序必須包含最新版本的OLE對(duì)象、存放OLE對(duì)象的源文件可以在計(jì)算機(jī)之間或通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行更新、存放OLE對(duì)象的源文件必須被其他應(yīng)用程序共享。嵌入操作通常用于如下場(chǎng)合:應(yīng)用程序不需要具有最新版本的OLE對(duì)象、嵌入的OLE對(duì)象不需要被多個(gè)應(yīng)用程序使用、源文件在被鏈接后不會(huì)被更新。 要注意的是VFP本身只是一個(gè)OLE客戶(hù)機(jī),而不是一個(gè)OLE服務(wù)器。 使用OLE對(duì)象 在應(yīng)用程序中使用OLE對(duì)象首先要考慮OLE對(duì)象的類(lèi)型,針對(duì)不同類(lèi)型的OLE對(duì)象,使用不同的方法來(lái)引用它們。當(dāng)程序中要引用的可插入型OLE對(duì)象較多時(shí)就要考慮用數(shù)據(jù)表的通用型字段來(lái)存儲(chǔ)它。 1、在VFP的數(shù)據(jù)表中添加OLE對(duì)象方法一:使用數(shù)據(jù)表設(shè)計(jì)器給數(shù)據(jù)表添加一個(gè)通用型字段,然后將可插入型OLE對(duì)象鏈接或嵌入到通用型字段的每個(gè)記錄中。通用字段包含一個(gè)10字節(jié)的指針,它指向該字段真正的內(nèi)容,通用型字段的真正類(lèi)型和數(shù)據(jù)大小取決于創(chuàng)建這些對(duì)象的OLE服務(wù)器。這些OLE對(duì)象是以鏈接方式還是以嵌入方式進(jìn)行操作與該應(yīng)用程序有關(guān)。若OLE對(duì)象是以鏈接方式進(jìn)行操作的,則數(shù)據(jù)表中只含有對(duì)OLE對(duì)象的引用,以及創(chuàng)建這些OLE對(duì)象的應(yīng)用程序的引用;若OLE對(duì)象是以嵌入方式進(jìn)行操作的,數(shù)據(jù)表中將含有相關(guān)OLE對(duì)象的副本,以及對(duì)創(chuàng)建這些OLE對(duì)象的應(yīng)用程序的引用。通用字段的大小僅受可用磁盤(pán)空間的限制。 方法二:使用APPENDGENERAL命令從文件中導(dǎo)入OLE對(duì)象并將其放入通用型字段中。語(yǔ)法: APPENDGENERALGeneraLFieLdName [FROMFiLeName FROMMEMOPictureFieLd?Name] [DATAcExpression] [LINK] [CLASSOLECLassName] 2、使用限制性可插入型OLE對(duì)象 使用通用型字段中所存儲(chǔ)的限制性可插入型OLE對(duì)象需要使用OLE綁定型控件,步驟如下: (1)在表單設(shè)計(jì)器中,將一個(gè)OLE綁定型控件添加到表單中。 (2)通過(guò)設(shè)置對(duì)象的ControLSource屬性指定包含OLE對(duì)象的通用型字段。如果數(shù)據(jù)表名為Inventory,通用型字段名為Current,那么可以將ControL?Source屬性設(shè)置成Inventory.Current。 (3)在表單上添加按鈕或菜單命令,用以瀏覽ControLSource屬性指定的通用型字段。 3、使用OLE控件(.OCX文件)及非限制性可插入型OLE對(duì)象 這兩類(lèi)對(duì)象需要使用OLE容器控件。OLE容器控件允許向應(yīng)用程序中加入OLE對(duì)象,包括OLE控件(.OCX文件)、非限制性可插入型OLE對(duì)象。OLE容器控件與OLE綁定型控件不同在于,它不與VFP表的一個(gè)通用型字段相連接。 若要在表單中添加OLE控件及非限制性可插入型OLE對(duì)象可按如下步驟進(jìn)行: (1)在表單設(shè)計(jì)器中,向表單中添加一個(gè)OLE容器控件。 (2)在“InsertObject”對(duì)話(huà)框中,選擇“CreateNew”或“CreatefromFiLe”或“InsertControL”選項(xiàng)。 (3)從顯示的列表中選擇適當(dāng)?shù)腛LE控件或創(chuàng)建適當(dāng)類(lèi)型的對(duì)象或增加一個(gè)嵌入文件。 在插入控件時(shí)如果所要的控件沒(méi)有出現(xiàn)在列表中,可選擇“AddControL”按鈕將其添加到列表中。也可以通過(guò)將OLE控件添加到表單控件工具欄中而將其添加到表單中。在選項(xiàng)對(duì)話(huà)框中選擇控件之后,單擊表單控件工具欄上的“ViewCLass”按鈕,從子菜單中選擇“OLEControL”,單擊OLE,然后拖動(dòng)控件,在表單上設(shè)置其大小。下面以一例子說(shuō)明如何在程序中使用非限制性可插入型OLE對(duì)象,本例首先將一個(gè)OLE容器控件加入表單,然后使用OLE容器控件的OLECLass和DocumentFiLe屬性將MicrosoftExceL作為OLE服務(wù)器,并將一個(gè)ExceL工作簿指定為要編輯的文件。DocumentFiLe屬性指定了在C驅(qū)動(dòng)器中ExceL路徑下一個(gè)名為BOOK1.XLS的工作簿。如果在DocumentFiLe屬性中指定的文件或路徑不存在,則本例程不能正常運(yùn)行,這時(shí)需要修改DocumentFiLe來(lái)指明一個(gè)存在的路徑和工作簿文件。另外BOOK1.XLS只能讀不能修改,下面是其VFP源代碼及其說(shuō)明。 frmMyForm=CREATEOBJECT(′Form′)&&創(chuàng)建表單 frmMyForm.CLosabLe=.F.&&廢止控制菜單框 frmMyForm.AddObject(′cmdCommand1′,′cmdMyCmdBtn′) 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=′/ CanceL=.T. Left=125 Top=210 Height=25 PROCEDURECLick CLEAREVENTS ENDDEFINE 4、使用OLE對(duì)象的屬性 OLE對(duì)象有一系列屬性可供使用,但是對(duì)包含在OLE容器控件中的OLE對(duì)象,要確保引用的是OLE對(duì)象的屬性而不是其容器的屬性,這需要將容器的Ob?ject屬性加到OLE對(duì)象名當(dāng)中。 5、使用OLE對(duì)象的方法 除了設(shè)置和讀取OLE對(duì)象的屬性外,還可以使用OLE對(duì)象的方法來(lái)操作OLE對(duì)象。例如,下面的程序使用了Ex?ceL對(duì)象的Add方法來(lái)創(chuàng)建ExceL工作簿,然后使用Save方法保存該工作簿,并使用Quit方法結(jié)束ExceL的本次運(yùn)行: oLeApp=CREATEOBJECT("Ex?ceL.AppLication") oLeApp.VisibLe=.T. oLeApp.Workbooks.Add oLeApp.CeLLs(1,1).VaLue=7 oLeApp.ActiveWorkbook.SaveAs("C:/TEMP.XLS") oLeApp.Quit 與使用屬性一樣,如果用容器控件創(chuàng)建對(duì)象,應(yīng)確保將“Object”加到引用對(duì)象方法的控件名稱(chēng)當(dāng)中。 6、訪問(wèn)集合中的OLE對(duì)象 一個(gè)對(duì)象類(lèi)型可以代表單個(gè)對(duì)象或若干相關(guān)對(duì)象的集合。 在程序中,集合是一個(gè)未經(jīng)排序的鏈表結(jié)構(gòu),每當(dāng)有對(duì)象被添加到集合中或從集合中移去時(shí),其余對(duì)象的位置都可能改變。使用集合的Count屬性對(duì)集合遍歷,可以訪問(wèn)集合中的所有對(duì)象。Count屬性可用來(lái)返回集合中項(xiàng)的數(shù)目。另外,可以使用Item方法返回集合中的某一項(xiàng)。 也可以訪問(wèn)集合內(nèi)的集合。例如,使用下列程序代碼可以在一個(gè)單元格區(qū)域內(nèi)訪問(wèn)某一單元格集合: oLeApp=CREATEOBJECT("ExceL.sheet") oLeApp.Range(oLeApp.CeLLs(1,1),oLeApp.CeLLs(10,10)).VaLue=100 7、使用OLE對(duì)象的數(shù)組利用OLE技術(shù),不但可以將數(shù)組傳遞給OLE對(duì)象的方法,而且可以接收OLE對(duì)象傳來(lái)的數(shù)組。傳遞數(shù)組的方式必須是按引用傳遞,即必須在數(shù)組名前加@符號(hào)(用VFP不能將二維以上的數(shù)組傳遞到OLE對(duì)象中)。例如,要發(fā)送一個(gè)VFP數(shù)組到ExceL中,可以使用以下程序代碼。它先在VFP中創(chuàng)建一個(gè)數(shù)組,給數(shù)組賦一些值,然后啟動(dòng)ExceL,創(chuàng)建一個(gè)工作簿,并給工作表的第一個(gè)單元格設(shè)置一個(gè)初始值,再將此值復(fù)制到數(shù)組中的其他工作表中:其中用到了ExceL的工作簿集(Workbooks對(duì)象),工作表集(Sheets對(duì)象)的相關(guān)屬性及方法和ExceL對(duì)象的GetCustomListContents方法。下列代碼將數(shù)組傳遞給方法FiLLAcrossSheets,以便將Sheet1中的第一區(qū)域內(nèi)容復(fù)制到其它工作表的相同區(qū)域。 DIMENSIONaV(2) aV(1)=″Sheet1″ aV(2)=″Sheet2″ oLeApp=CREATEOBJECT(″Ex?ceL.AppLication″) oLeApp.Workbooks.Add oLeI=oLeApp.Workbooks.Item(1) oLeI.Sheets.Item(1).CeLLs(1,1).VaLue=100&&初始值 oLeI.Sheets(@aV).FiLLAcrossSheets(oLeI.Worksheets(″Sheet1″).CeLLs(1,1)) oLeApp.VisibLe=.T. 下列代碼將一個(gè)數(shù)組返回到VFP,并顯示數(shù)組的內(nèi)容: oLeApp=CREATEOBJECT(″Ex?ceL.AppLication″) aOLeArray=oLeApp.GetCustomListContents(1)&&改變數(shù)組下標(biāo)可以顯示其它內(nèi)容 FORnIndex=1toALEN(aOLeArray) ?aOLeArray(nIndex) ENDFOR |
|