後一頁
前一頁
回目錄
回首頁
第八章 物件鍊結與嵌入(一)

  物件鍊結和嵌入(Object Linking and Embeding)是一群群組服務功能,它提供了一種用源於不同應用程式的資訊建立復合文檔的強有力方法。 物件可以是幾乎所有的資訊型式,如文字、點陣圖、向量圖形,甚至於聲音註解和錄像剪輯等。

  Windows附屬應用程式群群組中的書寫器是應用OLE的實例,使用按一下“物件 | 插入”選擇表項, 書寫器彈出插入對話方塊,對話方塊中列出了多個OLE伺服器程式,如公式編輯工具,繪圖工具,報表產生工具。用戶連續按兩下滑鼠左鍵,可激活一個OLE伺服器。在OLE伺服器中可編輯OLE物件,當用戶返回到書寫器中時,在書寫器文檔中將出現OLE物件。

  Delphi支援OLE技術,Delphi1.0可以建立OLE應用程式,Delphi2.0可建立OLE自動化伺服器和控制器程式。本章通過例程介紹物件鍊結與嵌入的基本概念,Delphi建立OLE物件的方法,OLE自動化的概念以及如何開發OLE自動化伺服器和控制器。 

8.1 OLE簡介 

8.1.1 OLE1.0OLE2.0 

        迄今為止,有兩種版本的OLEOLE1.0OLE2.0。當用戶在OLE1.0 伺服器中激活OLE物件,伺服器程式在前台打開自己的窗體,並獲得焦點。OLE窗體失去焦點,存在於單獨的窗體之中。

  OLE2.0伺服器採用“本地”(in place)激活方式。本地激活意味著伺服器選擇表與應用程式選擇表要進行融合,伺服器的狀態條更換應用程式狀態條,伺服器的工具條更換應用程式工具條。OLE物件在應用程式窗體中進行編輯,但所有過程均由伺服器處理。

  建立OLE物件的伺服器決定了OLE的激活方式。如果一個OLE1.0的物件在OLE2.0 編譯的應用程式中打開,它將採用OLE1.0的方式。 

8.1.2 鍊結與嵌入 

  連結物件的數據存檔在OLE伺服器建立的文件中,嵌入物件的數據存檔在OLE應用程式中。

  連結物件必須以文件形式存檔,只有對OLE伺服器已經建立好的OLE物件, 才能進行OLE鍊結,鍊結的OLE物件文件可被OLE應用程式或其它程式進行修改,OLE 伺服器和其它OLE應用程式也可以存取和修改OLE物件。物件數據存檔在某一處,但可以被多個應用程式存取。

  Delphi應用程式可以得到OLE物件文件中的最新數據。當OLE 物件數據被應用程式修改時,這些變化將在所有包含該物件的其它應用程式中體現。

  嵌入物件存檔在OLE應用程式中,其它應用程式不能存取該物件。只有在OLE應用程式中激活OLE物件才能對其進行編輯。嵌入的OLE物件不需要存檔在文件中,所有數據都在應用程式中,這就確保了OLE數據不會被偶然地解除或修改。不足之處是應用程式的規模因為存檔了OLE數據而增大了

  如果用戶想存檔對嵌入物件的修改,可以把OLE數據存入文件中,本章第3 節將詳細討論這個問題。

   8.1 使用鍊結或嵌入的原則。

───────────────────────────────

   何時使用鍊結         何時使用嵌入

———————————————————————————————

  想要對源物件進行修改及將   對源物件進行修改,並將這

  這些修改反映到其他與源對   些修改反映在一個特定的應

  象鍊結的應用程式或文本中   用程式或文本中

  源物件可能被多個OLE    源物件不可能被一個OLE

  用程式應用程式頻繁修改    用程式頻繁修改

  源物件的文件不會被頻繁移   源物件的文件可能被頻繁移

  動,且不會被解除     動,且不會被解除    

  物件很大,一般通過網路或   物件很小,或物件很大卻無法

  電子郵件進行分配       通過網路或電子郵件進行分配

─────────────────────────────── 

8.1.3 設計狀態OLE物件的建立 

  在Delphi中,可分別在設計狀態或執行狀態建立OLE物件,表8.2敘述了兩種狀態建立物件的差別。 

8.2 設計、執行狀態OLE物件的建立

──────────────────────────────────────

  設計狀態OLE物件的建立         執行狀態OLE物件的建立

——————————————————————————————————————

物件存檔在執行文件中,增加了所需 物件存檔在一個文件中或只在執行時

編譯的程式的規模       才有,減小了編譯程式的規模 

開發者需在設計時存取OLE伺服器   開發者不需要在設計時存取OLE伺服器 

執行時OLE物件已經建立,減小了   執行時OLE物件已經建立,增加了執行

執行時間               時間 

OLE物件在設計執行時間可行性編輯   OLE物件只能在執行時編輯

應用程式的OLE物件數目在設計時已   應用程式可以在執行時建立新的OLE

經確立                象

────────────────────────────────────── 

  在設計狀態,OLE伺服器不能被本地激活,只能在自己的窗體內激活。但在執行狀態,

只要OLE伺服器支援本地激活,就可以使用這種方式。 

8.1.4 OLE類、文件、項目 

  OLE類決定建立OLE物件的伺服器。有些應用程式需要建立多種型式的OLE物件,例如應用程式同時鍊結或嵌入公式、圖片等。OLE類也決定OLE物件所包含的數據型式,鍊結或嵌入物件均要定義OLE類。

  OLE文件是包含OLE物件數據的源文件。連結物件必須使用物件文件,因為連結物件在文件中存檔。如果應用程式從已存在的源文件中建立嵌入物件,也要使用OLE文件。例如,如果鍊結到QuattiPro筆記本的OLE物件TUTOR.WBI存儲在D:\DFFICE\QPW目錄下,則OLE文件就是D:\DFFICE\QPW\TUTOR.WBI。值得注意的是OLE文件只能為連結物件所定義,而對於嵌入物件,只需定義OLE類。

  OLE項目是代表鍊結或嵌入數據的OLE文件中的一部分。當應用程式希望OLE物件包含比OLE文件小的數據塊時,則必須使用OLE項目。

  例如,在QuattiPro筆記本中,OLE物件鍊結了GasCostsB4 B5 範圍的網格,OLE項目是$GasCosts;$B$4.$B$5。 

8.2 設計狀態OLE物件的建立  

  Dephi可以在設計狀態和執行狀態中建立OLE物件。本節介紹設計狀態OLE物件的建立。 

8.2.1 TOLEContainer部件 

  要建立OLE物件,需在窗體中加入OLE包容器部件。 應用程式部件包含鍊結或嵌入的物件。用該部件可顯示在OLE伺服器編輯的數據。部件的ObjClass,ObjDoc,ObjItem 屬性分別定義OLE類、文件、項目。要定義OLE物件是否本地激活,使用InPlaceActive 屬性。如果OLE物件可以本地激活,OLE伺服器選擇表將與OLE應用程式的選擇表進行融合,GroupIndex屬性的值將決定選擇表融合情況。 

8.2.2 OLE物件建立的步驟: 

  1.在窗體中增加OLE包容器部件;

  2.Object inspector中按一下ObjClassObjDoc屬性的省略按鈕,將出現插入物件對話方塊;

        3.如果要插入的OLE 物件已存儲在文件中,選擇“Creat From File”,而後定義該物件的檔案標簽和路徑名。如果是連結物件,則選擇鍊結檢查框。 如果是嵌入物件,選擇“Creat new”,並在物件型式列示方塊中選擇OLE物件;

  4.選擇OK按鈕;

  如果是建立新物件,OLE伺服器將激活,則可對OLE物件進行編輯,完成編輯後關閉OLE伺服器。典型的例子是按一下伺服器中的“File”或“File|Update”選擇表。

  5.此時ObjClass屬性中包含了相應的值,如果OLE物件從已存在的文件中建立或插入一

個連結物件,ObjDoc屬性包含了OLE文件。

  在設計物件狀態時也可以貼上去OLE物件,其步驟如下:

  1.激活伺服器應用程式,選擇OLE包容器部件;

  2.在伺服器中,將數據或物件拷貝到剪下來板;

  3.進入Delphi整合開發環境,選擇OLE包容器部件;

  4. Object inspector窗體中選擇ObjItem屬性的省略()按鈕;

  5.在清單中選擇OLE物件;

  6.選擇“Paste"建立一個嵌入物件或選擇"Pastelink"建立連結物件;

  7.選擇OK

OLE包容器部件在此時初始化。如果貼上去一個嵌入物件,ObjClass屬性將包含適當的值。如果貼上去一連結物件,ObjClass,ObjDoc,ObjItem屬性將全部定義。OLE 應用程式部件包含代表OLE物件的圖片。

  如果OLE伺服器程式支援OLE物件的拖放功能,則在設計狀態從伺服器中拖動物件至應用程式,應用程式將建立連結物件,具體步驟:

  1.激活伺服器,並Delphi整合開放環境中選擇要鍊結的物件;

  2.按隹滑鼠左鍵拖動OLE物件至設計狀態的窗體;

  3.鬆開鼠鍵釋放OLE物件。

  窗體將建立OLE應用程式並進行初始化。 

8.3 OLE應用程式的開發 

  Delphi可以在設計狀態和執行狀態建立OLE物件,上一節介紹的是在設計狀態如何建立OLE物件,這一節將通過例程介紹如何在執行狀態建立OLE物件、貼上去物件、拖動物件,以及OLE 物件的文件操作。我們開發的 OLE.dpr是一個OLE應用程式的實例

8.3.1 OLE應用程式介面開發 

  OLE.dpr採用了多文檔介面,父窗體有選擇表,工具條,狀態條,子窗體有一個OLE包容器部件,下面分別加以介紹。 

8.3.1.1 OLE應用程式的選擇表 

  OLE應用程式的選擇表與其它應用程式的主選擇表大體一致,如果應用程式中有支援本地動作的OLE 2.0物件,則要進行選擇表融合。查閱OLE 伺服器的資料可知道伺服器是否支援本地激活。

  OLE應用程式選擇表的GroupIndex屬性決定融合選擇表的位置,即融合選擇表是更換主選擇表,還是插入至應用程式的主選擇表中。

  OLE伺服器,將融合三群群組選擇表:Edit,View,Help,每群群組選擇表分配了唯一的群群組索引值。在OLE應用程式中任何索引值為1,3,5的選擇表群群組在選擇表融合時被OLE伺服器中具有相應索引值的菜 單更換。在本例程中,編輯選擇表項在選擇表融合時被伺服器的"Edit"覆寫。如圖8.3 要想存檔應用程式中的選擇表,分配有異於1,3,5的索引值。

8.3 融合後的選擇表

────────────────────────────────

選擇表  索引值    功能描述       來源(OLE激活時)

————————————————————————————————

文件   0   使用文件和結束程式      OLE應用程式

Edit 1 編輯OLE物件         OLE伺服器

物件   2 操作未動作的OLE物件     OLE應用程式

View 3 修改OLE物件的觀測方式    OLE伺服器

窗體  4 操縱窗體           OLE應用程式

Help 5 存取伺服器在線輔助敘述      OLE伺服器

───────────────────────────────── 

8.3.1.2 OLE工具條和狀態條 

  當OLE物件被本地激活時,OLE伺服器將試圖用自己的工具條和狀態條覆寫OLE應用程式的。如果應用程式想要本地激活, 就應該在應用程式中編寫相應的代碼讓伺服器使用工具條和狀態條。要做到這點,必須:

  ● 設定工具條和狀態條

  ● 在應用程式中加入狀態條

   通過修改面板部件的屬性建立工具條和狀態條。

  當OLE物件被本地激活時,面板或其他對齊控制將與OLE伺服器程式進行協調。 這意味

OLE伺服器可以覆寫OLE應用程式窗體中任何對齊控制,但鎖定的控制不能被覆寫。例如,

如果面板的align屬性是alTop,alleft,alBottom,alIngh時,控制未鎖定,OLE伺服器可以覆寫。要使應用程式的工具條、狀態條不被覆寫,可將locked屬性設定成真值。

  當OLE 物件被激活,OLE 伺服器在狀態條中顯示有關資訊時,OLE 應用程式部件的OnStatusLineEvent事件發生,一個文本字元會將從OLE伺服器傳至該事件句柄。 OnStatusLineEvent事件句柄的MSG參數接受文本字元。

以下代碼用以狀態條接收OLE伺服器的資訊:

procedure TOLEObjectForm.OleContainerStatusLineEvent(Sender: TObject;

Msg: String);

begin

OLEFrameForm.StatusBarPanel.Caption := Msg

end; 

8.3.2 插入OLE物件  

         執行狀態時進行物件鍊結與插入也要用到插入對話方塊,Delphi中沒有插入對話方塊部件,但可呼叫InsertOLEObjectDlg 函數來顯示對話方塊。 

8.3.2.1 InsertOLEObjectDlg函數聲明如下: 

function InsertOleObjectDlg(Form: TForm; HelpContext: THelpContext;

var PInitInfo: Pointer): Boolean;

  其中參數Form是擁有插入對話方塊的窗體,一般將擁有OLE包容器部件的窗體名字傳給Form.

參數Helplontext為插入物件對話方塊定義在線輔助敘述,如果應用程式沒有在線輔助敘述, HelpContext的值為零,對話方塊中將不出現輔助敘述按鈕。

  參數PInitInfo是一個無型式指標,該指標指向一個包含初始化OLE 部件資訊的內部數據結構。InsertOLEObjectDlg修改這個指標以指向一個有效的數據結構,該結構包含了對話方塊清單中被選擇的OLE 物件初始化資訊。當該指標被使用後,應呼叫ReleaseOLEInitInfo過程釋放初始化資訊所佔用的記憶體。

  當用戶選擇OK 按鈕關閉插入物件對話方塊,InsertOLEObjectDlg 返回真值,並把 PInitInfo指向包含OLE物件的初始化資訊的數據結構。 

8.3.2.2 初始化OLE包容器部件 

  為了使OLE包容器部件包含OLE物件,必須對部件進行初始化。 初始化主要是定義部件的OLE類。如果定義了OLE文件和OLE項目,初始化完成後,OLE 應用程式部件將包含OLE物件。

  呼叫InsertOLEObjetDlg函數可在其參數PInitInfo獲得關於OLE物件初始化的資訊時,把它傳遞給OLE包容器部件的PInitInfo屬性,OLE包容部件的ObjClass,ObjDoc,ObjItem屬性將被自動定義。

  初始化完成後,OLE物件被擊活。OLE伺服器將獲得控制,用戶可通過OLE伺服器對OLE物件進行編輯。當程式凍結OLE物件,OLE包容器部件將包含一幅圖像或點陣圖代表OLE物件。定義OLE包容器部件的AutoActive屬性可重新激活OLE物件,缺省情況下,連續按兩下OLE包容器部件可擊活OLE物件。

  例程中初始OLE物件的代碼如下:  

procedure TOLEObjectForm.InitializeOLEObject(Info: Pointer);

begin

OLEContainer.PInitInfo := Info;

ReleaseOLEInitInfo(Info)

end;

  該過程先將初始化指標傳給OLE包容器部件的PInitInfo屬性,而後釋放其記憶體空間。

  當用戶按一下例程中的“編輯 | 插入”選擇表項,將彈出插入物件對話方塊,選擇物件型式後, OLE物件被激活,該過程的代碼如下: 

  procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);

var

Info: Pointer;

begin

if InsertOLEObjectDlg(OLEFrameForm, 0, Info) then

InitializeOLEObject(Info);

end;

8.3.3 凍結OLE物件 

  如果OLE物件是OLE 1.0伺服器建立,物件將在OLE伺服器中被擊活,焦點和控制移到OLE伺服器中。要凍結一個由OLE 1.0建立的物件選擇"File | Exit"選擇表項。

  如果OLE 2.0伺服器支援本地激活,激活OLE物件後OLE伺服器將進行選擇表融合,並轉換工具條和狀態條。要凍結物件,只需在應用程式窗體中異於OLE包容器部件的任何地方按一下鼠

標鍵即可。

  另一種凍結物件的方法是把OLE包容器部件的Active屬性設定成假值。在例程中,“物件|凍結”選擇表項實現凍結功能。代碼如下: 

  procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);

begin

OLEContainer.Active := False

end; 

8.3.4 貼上去OLE物件 

  一些OLE伺服器允許用戶把OLE物件復制到剪貼簿,如果一個OLE物件復制到剪貼簿上,OLE應用程式可通過初始化OLE包容器部件來貼上去OLE物件。 

8.3.4.1 貼上去對話方塊

       把OLE物件貼上去到OLE包容器部件,要使用貼上去對話方塊,Delphi 中沒有貼上去對話方塊部件,但可用PasteSpecialDlg函數顯示貼上去對話方塊。

  PasteSpecialDlg 函數聲明如下: 

   function PasteSpecialDlg(Form :TForm;Const First:arrang; HelpConcert: THelpCOntext;var Forrmat : Word; var Hardle : THanlle var PInitInfo Point ) : Boolean;  

PasteSpecialDlg參數定義如下:

  參數Form是擁有貼上去對話方塊的窗體,應把包含OLE包容器部件的窗體名字傳遞給Form

        參數Format是註冊物件格式的數群群組,每群群組格式是BOLEFormat型式的數群群組成員。例如應用程式可註冊兩種物件格式。為嵌入物件註冊FEmbedClipFmt ,為連結物件註冊FlinkClipFmt

BOLEFormat 聲明如下: 

  BOLEFormat Record

fmtID : Word;

fmtName : array[0..31] of char;

fmtResultName : array[0..31] of char;

fmtMediun : BOleMedium;

fmIsLInkble : Bool;

end; 

        fmtID是物件的剪貼簿格式ID號,fmtID 可以是標準的剪貼簿格式:CF_TEXT,CF_BIFMAP。使用OLE 物件時, 需註冊新的剪貼簿格式來處理OLE 物件。WindowsAPI RegisterClipbordFormat函數註冊格式。

        fmtName表示是物件的名字,用以定義出現在貼上去對話方塊中列示方塊 內的物件標簽。在例程中,把“%S”匹配給fmtNameOLE伺服器自動地把格式化的名字代替“%S”參數。例如,如果OLE伺服器是畫筆,在程式執行時“Paintbrush Picture Object”將代替“%S”。

  fmtResultName,定義出現在貼上去對話方塊中結果檢查框內的名字。在例程中, 把“%S”傳給了fmtResultNameOLE伺服器自動地把格式結果標簽代替“%S”參數。例如,如果OLE伺服器是畫筆,程式執行時“Paintbrush Picture”將代替“%S”。

  fmtMediumBOLEMedium型式,是Windows決定物件格式的數據型式。例如,OLE

接物件的格式是BOLE_MED_STREAMOLE嵌入物件的格式是BOLE_MED_STORAGEBOLEMedium函數可計算出需要的BOLEMedium型式。

  fmtIsLinkale決定物件格式是否可聯連。聯連物件的fmtIsLinkable為真值。嵌入物件的fmtIsLinkable為假值。

  參數HelpContext 為貼上去對話方塊定義在線輔助敘述。如果應用程式沒有在線輔助敘述,HelpContext的值為零,對話方塊中將不出現輔助敘述按鈕。

  參數Form用以定義剪粘板上的格式,是由PasteSpecialDlg函數進行修改。因為使用貼上去對話方塊時,應用程式並不知道剪貼簿的格式。因而用Format來處理剪貼簿的數據。在本章例程中。 PasteSpecialDlg 函數把format 變數修改成FEmbedClipFmt FLinkClipFmt格式,這兩種格式是在主窗體的OnCreate事件中定義的。如果剪貼簿上的數據不是OLE物件,Format將被修改成其它型式的格式,如CF_TEXT等。

  參數Landle定義剪貼簿上的數據句柄。由PasteSpecialDlg函數進行修改。 當剪貼簿的數據型式不是OLE物件時,需用Handle參數存取剪貼簿數據。Handle是句柄型式。

  參數PInitInfo是一個指向OLE物件初始化結構的指標。前面在講述初始化OLE應用程式部件時也用到了這種指標。PasteSpecialDlg函數將修改PInitInfo指標以使其指向一個有效的數據結構。該結構包括了貼上去對話方塊中被選中的OLE物件的初始化資訊。

  下面介紹貼上去對話方塊中的部件。

  ● 將剪貼簿上的數據插入OLE應用程式,以實現物件嵌入,須選擇"Paste"

  ● OLE伺服器資源文件與OLE應用程式之間建立聯連,以實現物件聯連,須選擇: "Paste Line

  ● 要將聞連與嵌入的物件顯示成圖示,選擇"Display As Icon"。若這個檢查框被選中,改變圖示("Chang Icon")按鈕將顯示通過這個按鈕可改變OLE物件的缺省圖示或標籤。

  ● 如果數據不是註冊的格式,"Paste","Paste link"選擇鍵將變灰。 用戶無法從剪貼簿上貼上去數據。在本章例程中,剪貼簿上的數據只能是FEmbedClipFmt(嵌入物件) FlinkClipFmt(連結物件)

  ● 用戶在列示方塊中選擇數據型式。有時數據被解釋成多種型式。例如在包含OLE伺服器功能的字處理器中把文本復制到剪貼簿中。應用程式可以以文本和OLE物件兩種方式貼上去物件。列示方塊中出現的選擇項由OLE伺服器決定。

  用戶在貼上去對話方塊中選擇OK按鈕,PasteSpecialDlg返回真值,關於OLE 應用程式的初始化資訊貯存在PInitInfo所指向的結構中。 

8.3.4.2 在剪貼簿中使用OLE物件 

  要把OLE物件貼上去到OLE應用程式中,必須用Windows RegisterClipboardFormat函數為鍊連物件、嵌入物件註冊兩種新的剪貼簿格式。這些格式將在BOLEFormat記錄的fmtIdt欄位中被用到。

  本章例程中, 程式在OnCreate事件中註冊OLE物件的剪貼簿格式,以下代碼是主窗體的OnCreate事件: 

  procedure TOLEFrameForm.FormCreate(Sender: TObject);

begin

FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');

FLinkClipFmt := RegisterClipboardFormat('Link Source');

Fmts[0].fmtId := FEmbedClipFmt;

Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt);

Fmts[0].fmtIsLinkable := False;

StrPCopy(Fmts[0].fmtName, '%s');

StrPCopy(Fmts[0].fmtResultName, '%s');

Fmts[1].fmtId := FLinkClipFmt;

Fmts[1].fmtMedium := BOLEMediumCalc(FLinkClipFmt);

Fmts[1].fmtIsLinkable := True;

StrPCopy(Fmts[1].fmtName, '%s');

StrPCopy(Fmts[1].fmtResultName, '%s');

RegisterFormAsOleDropTarget(Self, Fmts)

end; 

        程式傳給RegistClipBroardFormat函數一個描述格式的參數,它返回一個Word型式的值。該值能唯一的辨識新註冊的格式。FEmbdeClipFmt,FlinkClipFmt TOLEFormat類的私有數據成員。 聲明如下:

  TYPE

TOLEForaneForm = Class(TForm)

private

FEmbedClipFmt: Word;

FLinkClipFmt: Word;

function CreateChild: TOLEObjectForm;

public

Fmts: array[0..1] of BOleFormat;

end; 

        在註冊剪貼簿格式後, 還必須定義OLE 格式才能進行物件貼上去。 每種格式定義在BOLEFormat記錄中。 程式中可能註冊標準剪貼簿格式並用這種格式進行貼上去。例如:註冊文本作為貼上去格式,將BOLEFormat記錄為fmtId欄位定義為CF_TEXTfmt Medium 欄位定義為BOLE_MED_HGLOBOL BOLEMediumCalc 函數可以根據定義的剪貼簿格式計算出fmtMedium值。在本章例程中,程式註冊了兩種格式,一種是鍊結OLE物件的格式,另一種是嵌入OLE物件的格式。

  BOLEFormat型式定義在BOLEDefs單元中,BOLEMediumCalc函數定義在ToCtrl單元。因此主窗中的interface部分應加入這兩個單元。 

  interface 

use,BOLEDefs,ToCtrl,

  在貼上去OLE物件前,應用程式必須知道在剪貼簿中是否有OLE物件。

  PasteSpecialEnabled函數可判斷貼上去對話方塊是否有效。如果剪貼簿上有Fmts定義的任何一種格式,PasteSpecialEnable將返回真值, 貼上去對話方塊才能成功地呼叫。反之呼叫貼上去對話方塊將不發生任何事件。

  以下代碼實現“編輯|貼上去”選擇表項的功能: 

procedure TOLEObjectForm.PasteSpecial1Click(Sender: TObject);

var

ClipFmt: Word;

DataHand: THandle;

Info: Pointer;

begin

if PasteSpecialEnabled(Self, OLEFrameForm.Fmts) then

if PasteSpecialDlg(Self, OLEFrameForm.Fmts, 0,

ClipFmt, DataHand, Info) then

InitializeOLEObject(Info)

end; 

只有在貼上去對話方塊有效時“編輯|貼上去”選擇表才有效,以下代碼實現此功能: 

  procedure TOLEObjectForm.Edit1Click(Sender: TObject);

begin

PasteSpecial1.Enabled := PasteSpecialEnabled(Self, OLEFrameForm.Fmts)

end; 

8.3.5 釋放OLE物件 

  從OLE伺服器拖動OLE物件並將其放在OLE應用程式是一種方便的物件鍊結與嵌入的方法。通過拖放操作,用戶不需要使用插入對話方塊或貼上去對話方塊來定義OLE物件。而只需用滑鼠鍵從OLE伺服器中“抓”住OLE物件,拖至OLE應用程式,鬆開滑鼠鍵,從而實現OLE物件的插入。 

8.3.5.1 註冊OLE釋放目標窗體 

  為了接收一個釋放的OLE物件,必須有一個窗體在Windows中註冊成OLE釋放目標,用RegisterFormASOLEDropTarget函數可實現此功能。 

  RegisterFormASOLEDropTarger(Form : TFrom;Const Fmts: array of BOlefrom).

  其中FormOLE物件的釋放目標窗體,在本章例程中,將子窗體傳遞給Form參數。

  Fmts是物件格式的數群群組。它是BOLEFormat 型式的數群群組。 所有要釋放的數據必須用Fmts數群群組中相應BOLEFormat元素註冊。

  在本章例程中,註冊的Fmts 數群群組與主窗體OnCreate事件 聲明的數群群組相同, 即:聯接物件格式和嵌入物件格式。如果想接收更多型式的釋放數據,就必須在Fmts數群群組中加入其它元素。例如應用程式要接收釋放的文本,Fmts需加第三個元素, fmtId 欄位為CF_TEXT,BOLEMedium欄位為BOLE_MED_HGLOBL.

拖放過程中不需要用BOLEFormatfmtName,fmtResultName欄位,如果程式只進行拖放操作而不進行物件貼上去,可以不初始化兩個欄位。

  在主窗體的OnCreate事件中可呼叫RegisterFormAsOLEDropTorget。 

procedure TOLEFrameForm,FormCreate(Sender : TObject);

begin

  Register FormASOleDropTarget(Self,Fmts)

end; 


後一頁
前一頁
回目錄
回首頁