8.3.2.2 初始化OLE包容器部件
為了使OLE包容器部件包含OLE對象,必須對部件進行初始化。 初始化主要是定義部件的OLE類。如果定義了OLE文件和OLE項目,初始化完成后,OLE 應(yīng)用程序部件將包含OLE對象。
調(diào)用InsertOLEObjetDlg函數(shù)可在其參數(shù)PInitInfo獲得關(guān)于OLE對象初始化的信息時,把它傳遞給OLE包容器部件的PInitInfo屬性,OLE包容部件的ObjClass,ObjDoc,ObjItem屬性將被自動定義。
初始化完成后,OLE對象被擊活。OLE服務(wù)器將獲得控制,用戶可通過OLE服務(wù)器對OLE對象進行編輯。當(dāng)程序凍結(jié)OLE對象,OLE包容器部件將包含一幅圖像或位圖代表OLE對象。定義OLE包容器部件的AutoActive屬性可重新激活OLE對象,缺省情況下,雙擊OLE包容器部件可擊活OLE對象。
例程中初始OLE對象的代碼如下:
procedure TOLEObjectForm.InitializeOLEObject(Info: Pointer);
begin
OLEContainer.PInitInfo := Info;
ReleaseOLEInitInfo(Info)
end;
該過程先將初始化指針傳給OLE包容器部件的PInitInfo屬性,而后釋放其內(nèi)存空間。
當(dāng)用戶單擊例程中的“編輯 | 插入”菜單項,將彈出插入對象對話框,選擇對象類型后, OLE對象被激活,該過程的代碼如下:
procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);
var
Info: Pointer;
begin
if InsertOLEObjectDlg(OLEFrameForm, 0, Info) then
InitializeOLEObject(Info);
end;
8.3.3 凍結(jié)OLE對象
如果OLE對象是OLE 1.0服務(wù)器創(chuàng)建,對象將在OLE服務(wù)器中被擊活,焦點和控制移到OLE服務(wù)器中。要凍結(jié)一個由OLE 1.0創(chuàng)建的對象選擇"File | Exit"菜單項。
如果OLE 2.0服務(wù)器支持本地激活,激活OLE對象后OLE服務(wù)器將進行菜單融合,并轉(zhuǎn)換工具條和狀態(tài)條。要凍結(jié)對象,只需在應(yīng)用程序窗體中異于OLE包容器部件的任何地方單擊鼠
標(biāo)鍵即可。
另一種凍結(jié)對象的方法是把OLE包容器部件的Active屬性設(shè)置成假值。在例程中,“對象|凍結(jié)”菜單項實現(xiàn)凍結(jié)功能。代碼如下:
procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);
begin
OLEContainer.Active := False
end;
8.3.4 粘貼OLE對象
一些OLE服務(wù)器允許用戶把OLE對象復(fù)制到剪貼板,如果一個OLE對象復(fù)制到剪貼板上,OLE應(yīng)用程序可通過初始化OLE包容器部件來粘貼OLE對象。
8.3.4.1 粘貼對話框
把OLE對象粘貼到OLE包容器部件,要使用粘貼對話框,Delphi 中沒有粘貼對話框部件,但可用PasteSpecialDlg函數(shù)顯示粘貼對話框。
PasteSpecialDlg 函數(shù)聲明如下:
function PasteSpecialDlg(Form :TForm;Const First:arrang; HelpConcert: THelpCOntext;var Forrmat : Word; var Hardle : THanlle var PInitInfo :Point ) : Boolean;
PasteSpecialDlg參數(shù)定義如下:
參數(shù)Form是擁有粘貼對話框的窗體,應(yīng)把包含OLE包容器部件的窗體名字傳遞給Form。
參數(shù)Format是注冊對象格式的數(shù)組,每組格式是BOLEFormat類型的數(shù)組成員。例如應(yīng)用程序可注冊兩種對象格式。為嵌入對象注冊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 可以是標(biāo)準(zhǔn)的剪貼板格式:CF_TEXT,CF_BIFMAP。使用OLE 對象時, 需注冊新的剪貼板格式來處理OLE 對象。Windows的API中 的RegisterClipbordFormat函數(shù)注冊格式。
fmtName表示是對象的名字,用以定義出現(xiàn)在粘貼對話框中列表框 內(nèi)的對象名稱。在例程中,把“%S”匹配給fmtName,OLE服務(wù)器自動地把格式化的名字代替“%S”參數(shù)。例如,如果OLE服務(wù)器是畫筆,在程序運行時“Paintbrush Picture Object”將代替“%S”。
fmtResultName,定義出現(xiàn)在粘貼對話框中結(jié)果檢查框內(nèi)的名字。在例程中, 把“%S”傳給了fmtResultName。OLE服務(wù)器自動地把格式結(jié)果名稱代替“%S”參數(shù)。例如,如果OLE服務(wù)器是畫筆,程序運行時“Paintbrush Picture”將代替“%S”。
fmtMedium是BOLEMedium類型,是Windows決定對象格式的數(shù)據(jù)類型。例如,OLE 聯(lián)
接對象的格式是BOLE_MED_STREAM。OLE嵌入對象的格式是BOLE_MED_STORAGE。BOLEMedium函數(shù)可計算出需要的BOLEMedium類型。
fmtIsLinkale決定對象格式是否可聯(lián)連。聯(lián)連對象的fmtIsLinkable為真值。嵌入對象的fmtIsLinkable為假值。
參數(shù)HelpContext 為粘貼對話框定義在線幫助。如果應(yīng)用程序沒有在線幫助,HelpContext的值為零,對話框中將不出現(xiàn)幫助按鈕。
參數(shù)Form用以定義剪粘板上的格式,是由PasteSpecialDlg函數(shù)進行修改。因為使用粘貼對話框時,應(yīng)用程序并不知道剪貼板的格式。因而用Format來處理剪貼板的數(shù)據(jù)。在本章例程中。 PasteSpecialDlg 函數(shù)把format 變量修改成FEmbedClipFmt 或FLinkClipFmt格式,這兩種格式是在主窗體的OnCreate事件中定義的。如果剪貼板上的數(shù)據(jù)不是OLE對象,F(xiàn)ormat將被修改成其它類型的格式,如CF_TEXT等。
參數(shù)Landle定義剪貼板上的數(shù)據(jù)句柄。由PasteSpecialDlg函數(shù)進行修改。 當(dāng)剪貼板的數(shù)據(jù)類型不是OLE對象時,需用Handle參數(shù)訪問剪貼板數(shù)據(jù)。Handle是句柄類型。
參數(shù)PInitInfo是一個指向OLE對象初始化結(jié)構(gòu)的指針。前面在講述初始化OLE應(yīng)用程序部件時也用到了這種指針。PasteSpecialDlg函數(shù)將修改PInitInfo指針以使其指向一個有效的數(shù)據(jù)結(jié)構(gòu)。該結(jié)構(gòu)包括了粘貼對話框中被選中的OLE對象的初始化信息。
下面介紹粘貼對話框中的部件。
● 將剪貼板上的數(shù)據(jù)插入OLE應(yīng)用程序,以實現(xiàn)對象嵌入,須選擇"Paste";
● 在OLE服務(wù)器資源文件與OLE應(yīng)用程序之間建立聯(lián)連,以實現(xiàn)對象聯(lián)連,須選擇: "Paste Line;
● 要將聞連與嵌入的對象顯示成圖標(biāo),選擇"Display As Icon"。若這個檢查框被選中,改變圖標(biāo)("Chang Icon")按鈕將顯示通過這個按鈕可改變OLE對象的缺省圖標(biāo)或標(biāo)簽。
● 如果數(shù)據(jù)不是注冊的格式,"Paste","Paste link"選擇鍵將變灰。 用戶無法從剪貼板上粘貼數(shù)據(jù)。在本章例程中,剪貼板上的數(shù)據(jù)只能是FEmbedClipFmt(嵌入對象) 和FlinkClipFmt(鏈接對象)。
● 用戶在列表框中選擇數(shù)據(jù)類型。有時數(shù)據(jù)被解釋成多種類型。例如在包含OLE服務(wù)器功能的字處理器中把文本復(fù)制到剪貼板中。應(yīng)用程序可以以文本和OLE對象兩種方式粘貼對象。列表框中出現(xiàn)的選擇項由OLE服務(wù)器決定。
用戶在粘貼對話框中選擇OK按鈕,PasteSpecialDlg返回真值,關(guān)于OLE 應(yīng)用程序的初始化信息貯存在PInitInfo所指向的結(jié)構(gòu)中。
8.3.4.2 在剪貼板中使用OLE對象
要把OLE對象粘貼到OLE應(yīng)用程序中,必須用Windows的 RegisterClipboardFormat函數(shù)為鏈連對象、嵌入對象注冊兩種新的剪貼板格式。這些格式將在BOLEFormat記錄的fmtIdt域中被用到。
本章例程中, 程序在OnCreate事件中注冊O(shè)LE對象的剪貼板格式,以下代碼是主窗體的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函數(shù)一個描述格式的參數(shù),它返回一個Word類型的值。該值能唯一的辨識新注冊的格式。FEmbdeClipFmt,FlinkClipFmt 是TOLEFormat類的私有數(shù)據(jù)成員。 聲明如下:
TYPE
TOLEForaneForm = Class(TForm)
…
private
FEmbedClipFmt: Word;
FLinkClipFmt: Word;
function CreateChild: TOLEObjectForm;
public
Fmts: array[0..1] of BOleFormat;
end;
在注冊剪貼板格式后, 還必須定義OLE 格式才能進行對象粘貼。 每種格式定義在BOLEFormat記錄中。 程序中可能注冊標(biāo)準(zhǔn)剪貼板格式并用這種格式進行粘貼。例如:注冊文本作為粘貼格式,將BOLEFormat記錄為fmtId域定義為CF_TEXT,fmt Medium 域定義為BOLE_MED_HGLOBOL。 BOLEMediumCalc 函數(shù)可以根據(jù)定義的剪貼板格式計算出fmtMedium值。在本章例程中,程序注冊了兩種格式,一種是鏈接OLE對象的格式,另一種是嵌入OLE對象的格式。
BOLEFormat類型定義在BOLEDefs單元中,BOLEMediumCalc函數(shù)定義在ToCtrl單元。因此主窗中的interface部分應(yīng)加入這兩個單元。
interface
use…,BOLEDefs,ToCtrl,
在粘貼OLE對象前,應(yīng)用程序必須知道在剪貼板中是否有OLE對象。
PasteSpecialEnabled函數(shù)可判斷粘貼對話框是否有效。如果剪貼板上有Fmts定義的任何一種格式,PasteSpecialEnable將返回真值, 粘貼對話框才能成功地調(diào)用。反之調(diào)用粘貼對話框?qū)⒉话l(fā)生任何事件。
以下代碼實現(xiàn)“編輯|粘貼”菜單項的功能:
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;
只有在粘貼對話框有效時“編輯|粘貼”菜單才有效,以下代碼實現(xiàn)此功能:
procedure TOLEObjectForm.Edit1Click(Sender: TObject);
begin
PasteSpecial1.Enabled := PasteSpecialEnabled(Self, OLEFrameForm.Fmts)
end;
相關(guān)推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |