第八章對象鏈接與嵌入(一_第1頁
第八章對象鏈接與嵌入(一_第2頁
第八章對象鏈接與嵌入(一_第3頁
第八章對象鏈接與嵌入(一_第4頁
第八章對象鏈接與嵌入(一_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、對象鏈接和嵌入(Object Linking and Embeding)是一組服務功能,它提供了一種用源于不同應用程序的信息創(chuàng)建復合文檔的強有力方法。 對象可以是幾乎所有的信息類型,如文字、位圖、矢量圖形,甚至于聲音注解和錄像剪輯等。Windows附件組中的書寫器是應用OLE的實例,使用單擊“對象 | 插入”菜單項, 書寫器彈出插入對話框,對話框中列出了多個OLE服務器程序,如公式編輯工具,繪圖工具,報表生成工具。用戶雙擊鼠標左鍵,可激活一個OLE服務器。在OLE服務器中可編輯OLE對象,當用戶返回到書寫器中時,在書寫器文檔中將出現(xiàn)OLE對象。Delphi支持OLE技術(shù),Delphi1.0可以

2、創(chuàng)建OLE應用程序,Delphi2.0可創(chuàng)建OLE自動化服務器和控制器程序。本章通過例程介紹對象鏈接與嵌入的基本概念,Delphi創(chuàng)建OLE對象的方法,OLE自動化的概念以及如何開發(fā)OLE自動化服務器和控制器。8.1 OLE簡介8.1.1 OLE1.0和OLE2.0 迄今為止,有兩種版本的OLE:OLE1.0和OLE2.0。當用戶在OLE1.0 服務器中激活OLE對象,服務器程序在前臺打開自己的窗體,并獲得焦點。OLE窗體失去焦點,存在于單獨的窗體之中。OLE2.0服務器采用“本地”(in place)激活方式。本地激活意味著服務器菜單與應用程序菜單要進行融合,服務器的狀態(tài)條更換應用程序狀態(tài)條

3、,服務器的工具條更換應用程序工具條。OLE對象在應用程序窗體中進行編輯,但所有過程均由服務器處理。創(chuàng)建OLE對象的服務器決定了OLE的激活方式。如果一個OLE1.0的對象在OLE2.0 編譯的應用程序中打開,它將采用OLE1.0的方式。8.1.2 鏈接與嵌入鏈接對象的數(shù)據(jù)保存在OLE服務器創(chuàng)建的文件中,嵌入對象的數(shù)據(jù)保存在OLE應用程序中。鏈接對象必須以文件形式保存,只有對OLE服務器已經(jīng)創(chuàng)建好的OLE對象, 才能進行OLE鏈接,鏈接的OLE對象文件可被OLE應用程序或其它程序進行修改,OLE 服務器和其它OLE應用程序也可以訪問和修改OLE對象。對象數(shù)據(jù)保存在某一處,但可以被多個應用程序訪問

4、。Delphi應用程序可以得到OLE對象文件中的最新數(shù)據(jù)。當OLE 對象數(shù)據(jù)被應用程序修改時,這些變化將在所有包含該對象的其它應用程序中體現(xiàn)。嵌入對象保存在OLE應用程序中,其它應用程序不能訪問該對象。只有在OLE應用程序中激活OLE對象才能對其進行編輯。嵌入的OLE對象不需要保存在文件中,所有數(shù)據(jù)都在應用程序中,這就確保了OLE數(shù)據(jù)不會被偶然地刪除或修改。不足之處是應用程序的規(guī)模因為保存了OLE數(shù)據(jù)而增大了 。如果用戶想保存對嵌入對象的修改,可以把OLE數(shù)據(jù)存入文件中,本章第3 節(jié)將詳細討論這個問題。 表8.1 使用鏈接或嵌入的原則。 何時使用鏈接何時使用嵌入想要對源對象進行修改及將對源對象

5、進行修改,并將這這些修改反映到其他與源對些修改反映在一個特定的應象鏈接的應用程序或文本中用程序或文本中源對象可能被多個OLE應 源對象不可能被一個OLE應用程序應用程序頻繁修改用程序頻繁修改源對象的文件不會被頻繁移源對象的文件可能被頻繁移動,且不會被刪除 動,且不會被刪除對象很大,一般通過網(wǎng)絡或?qū)ο蠛苄?,或?qū)ο蠛艽髤s無法電子郵件進行分配通過網(wǎng)絡或電子郵件進行分配8.1.3 設計狀態(tài)OLE對象的創(chuàng)建在Delphi中,可分別在設計狀態(tài)或運行狀態(tài)創(chuàng)建OLE對象,表8.2說明了兩種狀態(tài)創(chuàng)建對象的差別。表8.2 設計、運行狀態(tài)OLE對象的創(chuàng)建設計狀態(tài)OLE對象的創(chuàng)建 運行狀態(tài)OLE對象的創(chuàng)建對象保存在運

6、行文件中,增加了所需 對象保存在一個文件中或只在運行時編譯的程序的規(guī)模 才有,減小了編譯程序的規(guī)模開發(fā)者需在設計時訪問OLE服務器開發(fā)者不需要在設計時訪問OLE服務器運行時OLE對象已經(jīng)創(chuàng)建,減小了 運行時OLE對象已經(jīng)創(chuàng)建,增加了運行運行時間 時間OLE對象在設計運行時間可行性編輯 OLE對象只能在運行時編輯應用程序的OLE對象數(shù)目在設計時已 應用程序可以在運行時創(chuàng)建新的OLE對經(jīng)確立 象在設計狀態(tài),OLE服務器不能被本地激活,只能在自己的窗體內(nèi)激活。但在運行狀態(tài),只要OLE服務器支持本地激活,就可以使用這種方式。8.1.4 OLE類、文件、項目OLE類決定創(chuàng)建OLE對象的服務器。有些應用程

7、序需要創(chuàng)建多種類型的OLE對象,例如應用程序同時鏈接或嵌入公式、圖片等。OLE類也決定OLE對象所包含的數(shù)據(jù)類型,鏈接或嵌入對象均要定義OLE類。OLE文件是包含OLE對象數(shù)據(jù)的源文件。鏈接對象必須使用對象文件,因為鏈接對象在文件中保存。如果應用程序從已存在的源文件中創(chuàng)建嵌入對象,也要使用OLE文件。例如,如果鏈接到QuattiPro筆記本的OLE對象TUTOR.WBI存儲在D:DFFICEQPW目錄下,則OLE文件就是D:DFFICEQPWTUTOR.WBI。值得注意的是OLE文件只能為鏈接對象所定義,而對于嵌入對象,只需定義OLE類。OLE項目是代表鏈接或嵌入數(shù)據(jù)的OLE文件中的一部分。當

8、應用程序希望OLE對象包含比OLE文件小的數(shù)據(jù)塊時,則必須使用OLE項目。例如,在QuattiPro筆記本中,OLE對象鏈接了GasCosts的B4 到B5 范圍的網(wǎng)格,OLE項目是$GasCosts;$B$4.$B$5。8.2 設計狀態(tài)OLE對象的創(chuàng)建Dephi可以在設計狀態(tài)和運行狀態(tài)中創(chuàng)建OLE對象。本節(jié)介紹設計狀態(tài)OLE對象的創(chuàng)建。8.2.1 TOLEContainer部件要創(chuàng)建OLE對象,需在窗體中加入OLE包容器部件。 應用程序部件包含鏈接或嵌入的對象。用該部件可顯示在OLE服務器編輯的數(shù)據(jù)。部件的ObjClass,ObjDoc,ObjItem 屬性分別定義OLE類、文件、項目。要定

9、義OLE對象是否本地激活,使用InPlaceActive 屬性。如果OLE對象可以本地激活,OLE服務器菜單將與OLE應用程序的菜單進行融合,GroupIndex屬性的值將決定菜單融合情況。8.2.2 OLE對象創(chuàng)建的步驟:1.在窗體中增加OLE包容器部件;2.在Object inspector中單擊ObjClass或ObjDoc屬性的省略按鈕,將出現(xiàn)插入對象對話框; 3.如果要插入的OLE 對象已存儲在文件中,選擇“Creat From File”,而后定義該對象的文件名和路徑名。如果是鏈接對象,則選擇鏈接檢查框。 如果是嵌入對象,選擇“Creat new”,并在對象類型列表框中選擇OLE對

10、象;4.選擇OK按鈕;如果是創(chuàng)建新對象,OLE服務器將激活,則可對OLE對象進行編輯,完成編輯后關(guān)閉OLE服務器。典型的例子是單擊服務器中的“File”或“File|Update”菜單。5.此時ObjClass屬性中包含了相應的值,如果OLE對象從已存在的文件中創(chuàng)建或插入一個鏈接對象,ObjDoc屬性包含了OLE文件。在設計對象狀態(tài)時也可以粘貼OLE對象,其步驟如下:1.激活服務器應用程序,選擇OLE包容器部件;2.在服務器中,將數(shù)據(jù)或?qū)ο罂截惖郊羟邪澹?.進入Delphi集成開發(fā)環(huán)境,選擇OLE包容器部件;4.在 Object inspector窗體中選擇ObjItem屬性的省略()按鈕;5

11、.在列表中選擇OLE對象;6.選擇“Paste創(chuàng)建一個嵌入對象或選擇Pastelink創(chuàng)建鏈接對象;7.選擇OK。OLE包容器部件在此時初始化。如果粘貼一個嵌入對象,ObjClass屬性將包含適當?shù)闹怠H绻迟N一鏈接對象,ObjClass,ObjDoc,ObjItem屬性將全部定義。OLE 應用程序部件包含代表OLE對象的圖片。如果OLE服務器程序支持OLE對象的拖放功能,則在設計狀態(tài)從服務器中拖動對象至應用程序,應用程序?qū)?chuàng)建鏈接對象,具體步驟:1.激活服務器,并Delphi集成開放環(huán)境中選擇要鏈接的對象;2.按隹鼠標左鍵拖動OLE對象至設計狀態(tài)的窗體;3.松開鼠鍵釋放OLE對象。窗體將創(chuàng)建

12、OLE應用程序并進行初始化。8.3 OLE應用程序的開發(fā)Delphi可以在設計狀態(tài)和運行狀態(tài)創(chuàng)建OLE對象,上一節(jié)介紹的是在設計狀態(tài)如何創(chuàng)建OLE對象,這一節(jié)將通過例程介紹如何在運行狀態(tài)創(chuàng)建OLE對象、粘貼對象、拖動對象,以及OLE 對象的文件操作。我們開發(fā)的 OLE.dpr是一個OLE應用程序的實例8.3.1 OLE應用程序界面開發(fā)OLE.dpr采用了多文檔界面,父窗體有菜單,工具條,狀態(tài)條,子窗體有一個OLE包容器部件,下面分別加以介紹。8.3.1.1 OLE應用程序的菜單OLE應用程序的菜單與其它應用程序的主菜單大體一致,如果應用程序中有支持本地激活的OLE 2.0對象,則要進行菜單融合

13、。查閱OLE 服務器的資料可知道服務器是否支持本地激活。OLE應用程序菜單的GroupIndex屬性決定融合菜單的位置,即融合菜單是更換主菜單,還是插入至應用程序的主菜單中。OLE服務器,將融合三組菜單:Edit,View,Help,每組菜單分配了唯一的組索引值。在OLE應用程序中任何索引值為1,3,5的菜單組在菜單融合時被OLE服務器中具有相應索引值的菜 單更換。在本例程中,編輯菜單項在菜單融合時被服務器的Edit替換。如圖8.3。 要想保存應用程序中的菜單,分配有異于1,3,5的索引值。表8.3 融合后的菜單菜單 索引值功能描述來源(OLE激活時)文件 0 使用文件和退出程序 OLE應用程

14、序Edit 1 編輯OLE對象 OLE服務器對象 2 操作未激活的OLE對象 OLE應用程序View 3 修改OLE對象的觀測方式 OLE服務器窗體 4 操縱窗體 OLE應用程序Help 5 訪問服務器在線幫助 OLE服務器8.3.1.2 OLE工具條和狀態(tài)條當OLE對象被本地激活時,OLE服務器將試圖用自己的工具條和狀態(tài)條替換OLE應用程序的。如果應用程序想要本地激活, 就應該在應用程序中編寫相應的代碼讓服務器使用工具條和狀態(tài)條。要做到這點,必須: 設置工具條和狀態(tài)條 在應用程序中加入狀態(tài)條通過修改面板部件的屬性創(chuàng)建工具條和狀態(tài)條。當OLE對象被本地激活時,面板或其他對齊控制將與OLE服務器

15、程序進行協(xié)調(diào)。 這意味OLE服務器可以替換OLE應用程序窗體中任何對齊控制,但鎖定的控制不能被替換。例如, 如果面板的align屬性是alTop,alleft,alBottom,alIngh時,控制未鎖定,OLE服務器可以替換。要使應用程序的工具條、狀態(tài)條不被替換,可將locked屬性設置成真值。當OLE 對象被激活,OLE 服務器在狀態(tài)條中顯示有關(guān)信息時,OLE 應用程序部件的OnStatusLineEvent事件發(fā)生,一個文本字符會將從OLE服務器傳至該事件句柄。 OnStatusLineEvent事件句柄的MSG參數(shù)接受文本字符。以下代碼用以狀態(tài)條接收OLE服務器的信息:procedur

16、e TOLEObjectForm.OleContainerStatusLineEvent(Sender: TObject;Msg: String);beginOLEFrameForm.StatusBarPanel.Caption := Msgend;8.3.2 插入OLE對象 運行狀態(tài)時進行對象鏈接與插入也要用到插入對話框,Delphi中沒有插入對話框部件,但可調(diào)用InsertOLEObjectDlg 函數(shù)來顯示對話框。8.3.2.1 InsertOLEObjectDlg函數(shù)聲明如下:function InsertOleObjectDlg(Form: TForm; HelpContext: T

17、HelpContext;var PInitInfo: Pointer): Boolean;其中參數(shù)Form是擁有插入對話框的窗體,一般將擁有OLE包容器部件的窗體名字傳給Form.參數(shù)Helplontext為插入對象對話框定義在線幫助,如果應用程序沒有在線幫助, HelpContext的值為零,對話框中將不出現(xiàn)幫助按鈕。參數(shù)PInitInfo是一個無類型指針,該指針指向一個包含初始化OLE 部件信息的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。InsertOLEObjectDlg修改這個指針以指向一個有效的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)包含了對話框列表中被選擇的OLE 對象初始化信息。當該指針被使用后,應調(diào)用ReleaseOLEInit

18、Info過程釋放初始化信息所占用的內(nèi)存。當用戶選擇OK 按鈕關(guān)閉插入對象對話框,InsertOLEObjectDlg 返回真值,并把 PInitInfo指向包含OLE對象的初始化信息的數(shù)據(jù)結(jié)構(gòu)。8.3.2.2 初始化OLE包容器部件為了使OLE包容器部件包含OLE對象,必須對部件進行初始化。 初始化主要是定義部件的OLE類。如果定義了OLE文件和OLE項目,初始化完成后,OLE 應用程序部件將包含OLE對象。調(diào)用InsertOLEObjetDlg函數(shù)可在其參數(shù)PInitInfo獲得關(guān)于OLE對象初始化的信息時,把它傳遞給OLE包容器部件的PInitInfo屬性,OLE包容部件的ObjClass

19、,ObjDoc,ObjItem屬性將被自動定義。初始化完成后,OLE對象被擊活。OLE服務器將獲得控制,用戶可通過OLE服務器對OLE對象進行編輯。當程序凍結(jié)OLE對象,OLE包容器部件將包含一幅圖像或位圖代表OLE對象。定義OLE包容器部件的AutoActive屬性可重新激活OLE對象,缺省情況下,雙擊OLE包容器部件可擊活OLE對象。例程中初始OLE對象的代碼如下: procedure TOLEObjectForm.InitializeOLEObject(Info: Pointer);beginOLEContainer.PInitInfo := Info;ReleaseOLEInitInf

20、o(Info)end;該過程先將初始化指針傳給OLE包容器部件的PInitInfo屬性,而后釋放其內(nèi)存空間。當用戶單擊例程中的“編輯 | 插入”菜單項,將彈出插入對象對話框,選擇對象類型后, OLE對象被激活,該過程的代碼如下: procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);varInfo: Pointer;beginif InsertOLEObjectDlg(OLEFrameForm, 0, Info) thenInitializeOLEObject(Info);end;8.3.3 凍結(jié)OLE對象如果OLE對象是OL

21、E 1.0服務器創(chuàng)建,對象將在OLE服務器中被擊活,焦點和控制移到OLE服務器中。要凍結(jié)一個由OLE 1.0創(chuàng)建的對象選擇File | Exit菜單項。如果OLE 2.0服務器支持本地激活,激活OLE對象后OLE服務器將進行菜單融合,并轉(zhuǎn)換工具條和狀態(tài)條。要凍結(jié)對象,只需在應用程序窗體中異于OLE包容器部件的任何地方單擊鼠標鍵即可。另一種凍結(jié)對象的方法是把OLE包容器部件的Active屬性設置成假值。在例程中,“對象|凍結(jié)”菜單項實現(xiàn)凍結(jié)功能。代碼如下: procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);beginOLECon

22、tainer.Active := Falseend;8.3.4 粘貼OLE對象一些OLE服務器允許用戶把OLE對象復制到剪貼板,如果一個OLE對象復制到剪貼板上,OLE應用程序可通過初始化OLE包容器部件來粘貼OLE對象。8.3.4.1 粘貼對話框 把OLE對象粘貼到OLE包容器部件,要使用粘貼對話框,Delphi 中沒有粘貼對話框部件,但可用PasteSpecialDlg函數(shù)顯示粘貼對話框。PasteSpecialDlg 函數(shù)聲明如下: function PasteSpecialDlg(Form :TForm;Const First:arrang; HelpConcert: THelpCOn

23、text;var Forrmat : Word; var Hardle : THanlle var PInitInfo :Point ) : Boolean; PasteSpecialDlg參數(shù)定義如下:參數(shù)Form是擁有粘貼對話框的窗體,應把包含OLE包容器部件的窗體名字傳遞給Form。 參數(shù)Format是注冊對象格式的數(shù)組,每組格式是BOLEFormat類型的數(shù)組成員。例如應用程序可注冊兩種對象格式。為嵌入對象注冊FEmbedClipFmt ,為鏈接對象注冊FlinkClipFmt。BOLEFormat 聲明如下:BOLEFormat: RecordfmtID : Word;fmtName

24、 : array0.31 of char;fmtResultName : array0.31 of char;fmtMediun : BOleMedium;fmIsLInkble : Bool;end; fmtID是對象的剪貼板格式ID號,fmtID 可以是標準的剪貼板格式:CF_TEXT,CF_BIFMAP。使用OLE 對象時, 需注冊新的剪貼板格式來處理OLE 對象。Windows的API中 的RegisterClipbordFormat函數(shù)注冊格式。 fmtName表示是對象的名字,用以定義出現(xiàn)在粘貼對話框中列表框 內(nèi)的對象名稱。在例程中,把“S”匹配給fmtName,OLE服務器自動地

25、把格式化的名字代替“S”參數(shù)。例如,如果OLE服務器是畫筆,在程序運行時“Paintbrush Picture Object”將代替“S”。fmtResultName,定義出現(xiàn)在粘貼對話框中結(jié)果檢查框內(nèi)的名字。在例程中, 把“S”傳給了fmtResultName。OLE服務器自動地把格式結(jié)果名稱代替“S”參數(shù)。例如,如果OLE服務器是畫筆,程序運行時“Paintbrush Picture”將代替“S”。fmtMedium是BOLEMedium類型,是Windows決定對象格式的數(shù)據(jù)類型。例如,OLE 聯(lián)接對象的格式是BOLE_MED_STREAM。OLE嵌入對象的格式是BOLE_MED_STO

26、RAGE。BOLEMedium函數(shù)可計算出需要的BOLEMedium類型。fmtIsLinkale決定對象格式是否可聯(lián)連。聯(lián)連對象的fmtIsLinkable為真值。嵌入對象的fmtIsLinkable為假值。參數(shù)HelpContext 為粘貼對話框定義在線幫助。如果應用程序沒有在線幫助,HelpContext的值為零,對話框中將不出現(xiàn)幫助按鈕。參數(shù)Form用以定義剪粘板上的格式,是由PasteSpecialDlg函數(shù)進行修改。因為使用粘貼對話框時,應用程序并不知道剪貼板的格式。因而用Format來處理剪貼板的數(shù)據(jù)。在本章例程中。 PasteSpecialDlg 函數(shù)把format 變量修改成

27、FEmbedClipFmt 或FLinkClipFmt格式,這兩種格式是在主窗體的OnCreate事件中定義的。如果剪貼板上的數(shù)據(jù)不是OLE對象,F(xiàn)ormat將被修改成其它類型的格式,如CF_TEXT等。參數(shù)Landle定義剪貼板上的數(shù)據(jù)句柄。由PasteSpecialDlg函數(shù)進行修改。 當剪貼板的數(shù)據(jù)類型不是OLE對象時,需用Handle參數(shù)訪問剪貼板數(shù)據(jù)。Handle是句柄類型。參數(shù)PInitInfo是一個指向OLE對象初始化結(jié)構(gòu)的指針。前面在講述初始化OLE應用程序部件時也用到了這種指針。PasteSpecialDlg函數(shù)將修改PInitInfo指針以使其指向一個有效的數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)

28、包括了粘貼對話框中被選中的OLE對象的初始化信息。下面介紹粘貼對話框中的部件。 將剪貼板上的數(shù)據(jù)插入OLE應用程序,以實現(xiàn)對象嵌入,須選擇Paste; 在OLE服務器資源文件與OLE應用程序之間建立聯(lián)連,以實現(xiàn)對象聯(lián)連,須選擇: Paste Line; 要將聞連與嵌入的對象顯示成圖標,選擇Display As Icon。若這個檢查框被選中,改變圖標(Chang Icon)按鈕將顯示通過這個按鈕可改變OLE對象的缺省圖標或標簽。 如果數(shù)據(jù)不是注冊的格式,Paste,Paste link選擇鍵將變灰。 用戶無法從剪貼板上粘貼數(shù)據(jù)。在本章例程中,剪貼板上的數(shù)據(jù)只能是FEmbedClipFmt(嵌入對

29、象) 和FlinkClipFmt(鏈接對象)。 用戶在列表框中選擇數(shù)據(jù)類型。有時數(shù)據(jù)被解釋成多種類型。例如在包含OLE服務器功能的字處理器中把文本復制到剪貼板中。應用程序可以以文本和OLE對象兩種方式粘貼對象。列表框中出現(xiàn)的選擇項由OLE服務器決定。用戶在粘貼對話框中選擇OK按鈕,PasteSpecialDlg返回真值,關(guān)于OLE 應用程序的初始化信息貯存在PInitInfo所指向的結(jié)構(gòu)中。8.3.4.2 在剪貼板中使用OLE對象要把OLE對象粘貼到OLE應用程序中,必須用Windows的 RegisterClipboardFormat函數(shù)為鏈連對象、嵌入對象注冊兩種新的剪貼板格式。這些格式將

30、在BOLEFormat記錄的fmtIdt域中被用到。本章例程中, 程序在OnCreate事件中注冊OLE對象的剪貼板格式,以下代碼是主窗體的OnCreate事件: procedure TOLEFrameForm.FormCreate(Sender: TObject);beginFEmbedClipFmt := RegisterClipboardFormat(Embedded Object);FLinkClipFmt := RegisterClipboardFormat(Link Source);Fmts0.fmtId := FEmbedClipFmt;Fmts0.fmtMedium := BO

31、LEMediumCalc(FEmbedClipFmt);Fmts0.fmtIsLinkable := False;StrPCopy(Fmts0.fmtName, %s);StrPCopy(Fmts0.fmtResultName, %s);Fmts1.fmtId := FLinkClipFmt;Fmts1.fmtMedium := BOLEMediumCalc(FLinkClipFmt);Fmts1.fmtIsLinkable := True;StrPCopy(Fmts1.fmtName, %s);StrPCopy(Fmts1.fmtResultName, %s);RegisterFormAsO

32、leDropTarget(Self, Fmts)end; 程序傳給RegistClipBroardFormat函數(shù)一個描述格式的參數(shù),它返回一個Word類型的值。該值能唯一的辨識新注冊的格式。FEmbdeClipFmt,FlinkClipFmt 是TOLEFormat類的私有數(shù)據(jù)成員。 聲明如下:TYPETOLEForaneForm = Class(TForm) privateFEmbedClipFmt: Word;FLinkClipFmt: Word;function CreateChild: TOLEObjectForm;publicFmts: array0.1 of BOleFormat

33、;end; 在注冊剪貼板格式后, 還必須定義OLE 格式才能進行對象粘貼。 每種格式定義在BOLEFormat記錄中。 程序中可能注冊標準剪貼板格式并用這種格式進行粘貼。例如:注冊文本作為粘貼格式,將BOLEFormat記錄為fmtId域定義為CF_TEXT,fmt Medium 域定義為BOLE_MED_HGLOBOL。 BOLEMediumCalc 函數(shù)可以根據(jù)定義的剪貼板格式計算出fmtMedium值。在本章例程中,程序注冊了兩種格式,一種是鏈接OLE對象的格式,另一種是嵌入OLE對象的格式。BOLEFormat類型定義在BOLEDefs單元中,BOLEMediumCalc函數(shù)定義在To

34、Ctrl單元。因此主窗中的interface部分應加入這兩個單元。interfaceuse,BOLEDefs,ToCtrl,在粘貼OLE對象前,應用程序必須知道在剪貼板中是否有OLE對象。PasteSpecialEnabled函數(shù)可判斷粘貼對話框是否有效。如果剪貼板上有Fmts定義的任何一種格式,PasteSpecialEnable將返回真值, 粘貼對話框才能成功地調(diào)用。反之調(diào)用粘貼對話框?qū)⒉话l(fā)生任何事件。以下代碼實現(xiàn)“編輯|粘貼”菜單項的功能:procedure TOLEObjectForm.PasteSpecial1Click(Sender: TObject);varClipFmt: Word;DataHand: THandle;Info: Point

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論