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