程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第八章-對象鏈接與嵌入(一)(3)

第八章-對象鏈接與嵌入(一)(3)

編輯:Delphi

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 對象。Windows的API中 的RegisterClipbordFormat函數注冊格式。

fmtName表示是對象的名字,用以定義出現在粘貼對話框中列表框 內的對象名稱。在例程中,把“%S”匹配給fmtName,OLE服務器自動地把格式化的名字代替“%S”參數。例如,如果OLE服務器是畫筆,在程序運行時“Paintbrush Picture Object”將代替“%S”。

fmtResultName,定義出現在粘貼對話框中結果檢查框內的名字。在例程中, 把“%S”傳給了fmtResultName。OLE服務器自動地把格式結果名稱代替“%S”參數。例如,如果OLE服務器是畫筆,程序運行時“Paintbrush Picture”將代替“%S”。

fmtMedium是BOLEMedium類型,是Windows決定對象格式的數據類型。例如,OLE 聯

接對象的格式是BOLE_MED_STREAM。OLE嵌入對象的格式是BOLE_MED_STORAGE。BOLEMedium函數可計算出需要的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所指向的結構中。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved