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_TEXT,fmt 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).
其中Form是OLE對象的釋放目標窗體,在本章例程中,將子窗體傳遞給Form參數。
Fmts是對象格式的數組。它是BOLEFormat 類型的數組。 所有要釋放的數據必須用Fmts數組中相應BOLEFormat元素注冊。
在本章例程中,注冊的Fmts 數組與主窗體OnCreate事件 聲明的數組相同, 即:聯接對象格式和嵌入對象格式。如果想接收更多類型的釋放數據,就必須在Fmts數組中加入其它元素。例如應用程序要接收釋放的文本,Fmts需加第三個元素, 其fmtId 域為CF_TEXT,BOLEMedium域為BOLE_MED_HGLOBL.
拖放過程中不需要用BOLEFormat的fmtName,fmtResultName域,如果程序只進行拖放操作而不進行對象粘貼,可以不初始化兩個域。
在主窗體的OnCreate事件中可調用RegisterFormAsOLEDropTorget。
procedure TOLEFrameForm,FormCreate(Sender : TObject);
begin…
Register FormASOleDropTarget(Self,Fmts)
end;