当前位置: 首页 > 学习 > 电脑学习 > 程序设计 > Delphi > 基础教程 > 正文

Delphi 对象链接与嵌入(二)

http://www.zk168.com.cn  招考学习网 2006-4-7 9:41:05
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--

8.3.2.2 初始化OLE包容器部件 

  为了使OLE包容器部件包含OLE对象,必须对部件进行初始化。 初始化主要是定义部件的OLE类。如果定义了OLE文件和OLE项目,初始化完成后,OLE 应用程序部件将包含OLE对象。

  调用InsertOLEObjetDlg函数可在其参数PInitInfo获得关于OLE对象初始化的信息时,把它传递给OLE包容器部件的PInitInfo属性,OLE包容部件的ObjClass,ObjDoc,ObjItem属性将被自动定义。

  初始化完成后,OLE对象被击活。OLE服务器将获得控制,用户可通过OLE服务器对OLE对象进行编辑。当程序冻结OLE对象,OLE包容器部件将包含一幅图像或位图代表OLE对象。定义OLE包容器部件的AutoActive属性可重新激活OLE对象,缺省情况下,双击OLE包容器部件可击活OLE对象。

  例程中初始OLE对象的代码如下:  

procedure TOLEObjectForm.InitializeOLEObject(Info: Pointer);

begin

OLEContainer.PInitInfo := Info;

ReleaseOLEInitInfo(Info)

end;

  该过程先将初始化指针传给OLE包容器部件的PInitInfo属性,而后释放其内存空间。

  当用户单击例程中的“编辑 | 插入”菜单项,将弹出插入对象对话框,选择对象类型后,OLE对象被激活,该过程的代码如下: 

  procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);

var

Info: Pointer;

begin

if InsertOLEObjectDlg(OLEFrameForm, 0, Info) then

InitializeOLEObject(Info);

end;

8.3.3 冻结OLE对象 

  如果OLE对象是OLE 1.0服务器创建,对象将在OLE服务器中被击活,焦点和控制移到OLE服务器中。要冻结一个由OLE 1.0创建的对象选择"File | Exit"菜单项。

  如果OLE 2.0服务器支持本地激活,激活OLE对象后OLE服务器将进行菜单融合,并转换工具条和状态条。要冻结对象,只需在应用程序窗体中异于OLE包容器部件的任何地方单击鼠

标键即可。

  另一种冻结对象的方法是把OLE包容器部件的Active属性设置成假值。在例程中,“对象|冻结”菜单项实现冻结功能。代码如下: 

  procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);

begin

OLEContainer.Active := False

end; 

8.3.4 粘贴OLE对象 

  一些OLE服务器允许用户把OLE对象复制到剪贴板,如果一个OLE对象复制到剪贴板上,OLE应用程序可通过初始化OLE包容器部件来粘贴OLE对象。 

8.3.4.1 粘贴对话框

       把OLE对象粘贴到OLE包容器部件,要使用粘贴对话框,Delphi中没有粘贴对话框部件,但可用PasteSpecialDlg函数显示粘贴对话框。

  PasteSpecialDlg 函数声明如下: 

   function PasteSpecialDlg(Form :TForm;Const First:arrang; HelpConcert:THelpCOntext;var Forrmat : Word; var Hardle : THanlle var PInitInfo :Point ) : Boolean;  

PasteSpecialDlg参数定义如下:

  参数Form是拥有粘贴对话框的窗体,应把包含OLE包容器部件的窗体名字传递给Form。

        参数Format是注册对象格式的数组,每组格式是BOLEFormat类型的数组成员。例如应用程序可注册两种对象格式。为嵌入对象注册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 可以是标准的剪贴板格式:CF_TEXT,CF_BIFMAP。使用OLE 对象时,需注册新的剪贴板格式来处理OLE 对象。Windows的API中 的RegisterClipbordFormat函数注册格式。

        fmtName表示是对象的名字,用以定义出现在粘贴对话框中列表框内的对象名称。在例程中,把“%S”匹配给fmtName,OLE服务器自动地把格式化的名字代替“%S”参数。例如,如果OLE服务器是画笔,在程序运行时“Paintbrush Picture Object”将代替“%S”。

  fmtResultName,定义出现在粘贴对话框中结果检查框内的名字。在例程中,把“%S”传给了fmtResultName。OLE服务器自动地把格式结果名称代替“%S”参数。例如,如果OLE服务器是画笔,程序运行时“Paintbrush Picture”将代替“%S”。

  fmtMedium是BOLEMedium类型,是Windows决定对象格式的数据类型。例如,OLE联

接对象的格式是BOLE_MED_STREAM。OLE嵌入对象的格式是BOLE_MED_STORAGE。BOLEMedium函数可计算出需要的BOLEMedium类型。

  fmtIsLinkale决定对象格式是否可联连。联连对象的fmtIsLinkable为真值。嵌入对象的fmtIsLinkable为假值。

  参数HelpContext 为粘贴对话框定义在线帮助。如果应用程序没有在线帮助,HelpContext的值为零,对话框中将不出现帮助按钮。

  参数Form用以定义剪粘板上的格式,是由PasteSpecialDlg函数进行修改。因为使用粘贴对话框时,应用程序并不知道剪贴板的格式。因而用Format来处理剪贴板的数据。在本章例程中。PasteSpecialDlg 函数把format 变量修改成FEmbedClipFmt 或FLinkClipFmt格式,这两种格式是在主窗体的OnCreate事件中定义的。如果剪贴板上的数据不是OLE对象,Format将被修改成其它类型的格式,如CF_TEXT等。

  参数Landle定义剪贴板上的数据句柄。由PasteSpecialDlg函数进行修改。 当剪贴板的数据类型不是OLE对象时,需用Handle参数访问剪贴板数据。Handle是句柄类型。

  参数PInitInfo是一个指向OLE对象初始化结构的指针。前面在讲述初始化OLE应用程序部件时也用到了这种指针。PasteSpecialDlg函数将修改PInitInfo指针以使其指向一个有效的数据结构。该结构包括了粘贴对话框中被选中的OLE对象的初始化信息。

  下面介绍粘贴对话框中的部件。

  ● 将剪贴板上的数据插入OLE应用程序,以实现对象嵌入,须选择"Paste";

  ● 在OLE服务器资源文件与OLE应用程序之间建立联连,以实现对象联连,须选择:"Paste Line;

  ● 要将闻连与嵌入的对象显示成图标,选择"DisplayAs Icon"。若这个检查框被选中,改变图标("ChangIcon")按钮将显示通过这个按钮可改变OLE对象的缺省图标或标签。

  ● 如果数据不是注册的格式,"Paste","Pastelink"选择键将变灰。 用户无法从剪贴板上粘贴数据。在本章例程中,剪贴板上的数据只能是FEmbedClipFmt(嵌入对象) 和FlinkClipFmt(链接对象)。

  ● 用户在列表框中选择数据类型。有时数据被解释成多种类型。例如在包含OLE服务器功能的字处理器中把文本复制到剪贴板中。应用程序可以以文本和OLE对象两种方式粘贴对象。列表框中出现的选择项由OLE服务器决定。

  用户在粘贴对话框中选择OK按钮,PasteSpecialDlg返回真值,关于OLE 应用程序的初始化信息贮存在PInitInfo所指向的结构中。 

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; 

-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
最新入库:
 
·实质、过程及意义——阿多尔诺“否定的辩证法”探微
·从Ontology的译名之争看哲学术语的翻译原则
·论马克思主义哲学经典的解释——解释学方法及其在马克
·中国哲学当前的核心与周边问题
·和合学与21世纪文化价值和科技
·中国文化的和合精神与21世纪
·宗教之间理当相互宽容
·上半个世纪的自由主义
·殷周至春秋时期神人关系之演进
·大学之道:构建以“三纲八目”为核心的道德修养体系
相关内容:
 
网友点评:
 
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
友情提醒:
 1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网
 友来信指正!
 2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
 3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
 4.如需转载请注明出处及作者,谢谢合作!
 5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
 6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
 7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL:  XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接!
你问我答 更多>>