首页 / 软件开发 / Delphi / 第八章-对象链接与嵌入(一)(4)
第八章-对象链接与嵌入(一)(4)2007-05-078.3.4.2 在剪贴板中使用OLE对象 要把OLE对象粘贴到OLE应用程序中,必须用Windows的 RegisterClipboardFormat函数为链连对象、嵌入对象注册两种新的剪贴板格式。这些格式将在BOLEFormat记录的fmtIdt域中被用到。本章例程中, 程序在OnCreate事件中注册OLE对象的剪贴板格式,以下代码是主窗体的OnCreate事件: procedure TOLEFrameForm.FormCreate(Sender: TObject);beginFEmbedClipFmt := 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类的私有数据成员。 声明如下:TYPETOLEForaneForm = Class(TForm)… privateFEmbedClipFmt: Word;FLinkClipFmt: Word;function CreateChild: TOLEObjectForm;publicFmts: 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);varClipFmt: Word;DataHand: THandle;Info: Pointer;beginif PasteSpecialEnabled(Self, OLEFrameForm.Fmts) thenif PasteSpecialDlg(Self, OLEFrameForm.Fmts, 0,ClipFmt, DataHand, Info) thenInitializeOLEObject(Info)end; 只有在粘贴对话框有效时“编辑|粘贴”菜单才有效,以下代码实现此功能: procedure TOLEObjectForm.Edit1Click(Sender: TObject);beginPasteSpecial1.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;