第八章-对象链接与嵌入(一)(4)

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; 

时间: 2024-08-04 04:34:30

第八章-对象链接与嵌入(一)(4)的相关文章

第八章-对象链接与嵌入(一)(1)

对象链接和嵌入(Object Linking and Embeding)是一组服务功能,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法. 对象可以是几乎所有的信息类型,如文字.位图.矢量图形,甚至于声音注解和录像剪辑等. Windows附件组中的书写器是应用OLE的实例,使用单击"对象 | 插入"菜单项, 书写器弹出插入对话框,对话框中列出了多个OLE服务器程序,如公式编辑工具,绘图工具,报表生成工具.用户双击鼠标左键,可激活一个OLE服务器.在OLE服务器中可编辑OLE

第八章-对象链接与嵌入(一)(2)

8.2 设计状态OLE对象的创建 Dephi可以在设计状态和运行状态中创建OLE对象.本节介绍设计状态OLE对象的创建. 8.2.1 TOLEContainer部件 要创建OLE对象,需在窗体中加入OLE包容器部件. 应用程序部件包含链接或嵌入的对象.用该部件可显示在OLE服务器编辑的数据.部件的ObjClass,ObjDoc,ObjItem 属性分别定义OLE类.文件.项目.要定义OLE对象是否本地激活,使用InPlaceActive 属性.如果OLE对象可以本地激活,OLE服务器菜单将与OL

第八章-对象链接与嵌入(二)(1)

8.3.5.2 在应用程序中释放OLE对象 当一个对象释放到一个窗体,该窗体发生OnDragDrop 事件.该对象定义为TDragDropEvent方法中的Source参数,而TDragDropEvent 方法是用来处理OnDragDrop事件". 如果Source 是一个OLE 对象, 那么它是TOLEDropNotify 对象的派生类型. TOLEDropNotify对象有一个与OLE包容器部件PInitInfo属性相对应的PIniInfo属性. 如果一个OLE对象被释放.PInitInfo

第八章-对象链接与嵌入(一)(3)

8.3.2.2 初始化OLE包容器部件 为了使OLE包容器部件包含OLE对象,必须对部件进行初始化. 初始化主要是定义部件的OLE类.如果定义了OLE文件和OLE项目,初始化完成后,OLE 应用程序部件将包含OLE对象. 调用InsertOLEObjetDlg函数可在其参数PInitInfo获得关于OLE对象初始化的信息时,把它传递给OLE包容器部件的PInitInfo属性,OLE包容部件的ObjClass,ObjDoc,ObjItem属性将被自动定义. 初始化完成后,OLE对象被击活.OLE服

第八章-对象链接与嵌入(二)(4)

8.4.3 自动化另一程序 每个服务器在系统注册中有一个叫ProgID的关键定,主要用以控制器辨识服务器.任何控制器可以用ProgID号来创建OLE对象实例.例程AutoForm是控制器程序,它在其主窗体创建了OLE对象实例. procedure TMainForm.FormCreate(Sender : TObject); begin try MemoEdit := CreateOleObject('MemoEdit.Application'); except MessageDlg( 'An

第八章-对象链接与嵌入(二)(3)

8.4.2 创建OLE自动化服务器 OLE自动化服务器是应用程序或动态链接库(DLL),它可向OLE 自动化控制器输出OLE对象. MemoEditdpr 就是OLE 自动化服务器, 在MemoAuto 单元中注册了MemoEdit.Appdication自动化类,所有OLE控制器均可对MemoEdit.Application进行引用. 在Windows环境下有两种OLE自动化服务器,进程内服务器和进程外服务器, Delphi可创建这两种服务器. 进程内服务器是输出OLE自动化对象的动态链接库.

第八章-对象链接与嵌入(二)(2)

8.4 OLE自动化 OLE自动化是Windows应用程序操纵另一个程序的一种机制.OLE 2.0提供了一种方法来集成应用程序,这就是应用程序之间的命令操作. 利用OLE 2.0,程序员可以定义一组命令,使它们进入到其它程序中.这些命令可带参数.看起来很象应用程序在调用函数或过程一样.采用上述办法, 可以在人不参与的情况下,就能使得两个应用程序的相互作用. 被自动化的程序称作自动化对象或自动化服务器, 操作或自动化其他程序的应用程序称为自动化控制器或自动化客户器. Delphi2.0完全支持OL

word2007链接或嵌入Excel工作表

  如果要在文档内容与 Microsoft Office Excel 工作簿的内容之间创建动态链接,则可以将内容作为对象插入.与粘贴内容(如通过按 Ctrl+V 粘贴)不同,将内容作为链接对象或嵌入对象插入时,您可在原始程序中处理内容. 如果将单元格作为 Excel 对象插入文档中,Microsoft Office Word 将在您双击单元格时运行 Excel,这样您就能使用 Excel 命令处理工作表内容. 如果将整个 Excel 工作表作为对象插入,文档中只会显示一个工作表.要显示不同的工作

word2007链接或嵌入 PowerPoint 幻灯片

  如果要在文档内容与 Microsoft Office PowerPoint 演示文稿的内容之间创建动态链接,则将内容作为对象插入.与粘贴内容(如通过按 Ctrl+V 粘贴)不同,将内容作为链接对象或嵌入对象插入时,您仍可在原始程序中处理内容. 如果将幻灯片作为 PowerPoint 对象插入文档中,Microsoft Office Word 将在您双击幻灯片时运行 PowerPoint,这样您就能使用 PowerPoint 命令处理幻灯片. 如果将整个 PowerPoint 演示文稿作为对象