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

Delphi 对象链接与嵌入(一)

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

  对象链接和嵌入(Object Linking and Embeding)是一组服务功能,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。对象可以是几乎所有的信息类型,如文字、位图、矢量图形,甚至于声音注解和录像剪辑等。

  Windows附件组中的书写器是应用OLE的实例,使用单击“对象 | 插入”菜单项, 书写器弹出插入对话框,对话框中列出了多个OLE服务器程序,如公式编辑工具,绘图工具,报表生成工具。用户双击鼠标左键,可激活一个OLE服务器。在OLE服务器中可编辑OLE对象,当用户返回到书写器中时,在书写器文档中将出现OLE对象。

  Delphi支持OLE技术,Delphi1.0可以创建OLE应用程序,Delphi2.0可创建OLE自动化服务器和控制器程序。本章通过例程介绍对象链接与嵌入的基本概念,Delphi创建OLE对象的方法,OLE自动化的概念以及如何开发OLE自动化服务器和控制器。 

8.1 OLE简介 

8.1.1 OLE1.0和OLE2.0 

        迄今为止,有两种版本的OLE:OLE1.0和OLE2.0。当用户在OLE1.0 服务器中激活OLE对象,服务器程序在前台打开自己的窗体,并获得焦点。OLE窗体失去焦点,存在于单独的窗体之中。

  OLE2.0服务器采用“本地”(inplace)激活方式。本地激活意味着服务器菜单与应用程序菜单要进行融合,服务器的状态条更换应用程序状态条,服务器的工具条更换应用程序工具条。OLE对象在应用程序窗体中进行编辑,但所有过程均由服务器处理。

  创建OLE对象的服务器决定了OLE的激活方式。如果一个OLE1.0的对象在OLE2.0 编译的应用程序中打开,它将采用OLE1.0的方式。 

8.1.2 链接与嵌入 

  链接对象的数据保存在OLE服务器创建的文件中,嵌入对象的数据保存在OLE应用程序中。

  链接对象必须以文件形式保存,只有对OLE服务器已经创建好的OLE对象,才能进行OLE链接,链接的OLE对象文件可被OLE应用程序或其它程序进行修改,OLE服务器和其它OLE应用程序也可以访问和修改OLE对象。对象数据保存在某一处,但可以被多个应用程序访问。

  Delphi应用程序可以得到OLE对象文件中的最新数据。当OLE 对象数据被应用程序修改时,这些变化将在所有包含该对象的其它应用程序中体现。

  嵌入对象保存在OLE应用程序中,其它应用程序不能访问该对象。只有在OLE应用程序中激活OLE对象才能对其进行编辑。嵌入的OLE对象不需要保存在文件中,所有数据都在应用程序中,这就确保了OLE数据不会被偶然地删除或修改。不足之处是应用程序的规模因为保存了OLE数据而增大了 。

  如果用户想保存对嵌入对象的修改,可以把OLE数据存入文件中,本章第3节将详细讨论这个问题。

   表8.1 使用链接或嵌入的原则。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   何时使用链接         何时使用嵌入

───────────────────────────────

  想要对源对象进行修改及将   对源对象进行修改,并将这

  这些修改反映到其他与源对   些修改反映在一个特定的应

  象链接的应用程序或文本中   用程序或文本中

  源对象可能被多个OLE应    源对象不可能被一个OLE应

  用程序应用程序频繁修改    用程序频繁修改

  源对象的文件不会被频繁移   源对象的文件可能被频繁移

  动,且不会被删除     动,且不会被删除    

  对象很大,一般通过网络或   对象很小,或对象很大却无法

  电子邮件进行分配       通过网络或电子邮件进行分配

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

8.1.3 设计状态OLE对象的创建 

  在Delphi中,可分别在设计状态或运行状态创建OLE对象,表8.2说明了两种状态创建对象的差别。 

表8.2 设计、运行状态OLE对象的创建

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  设计状态OLE对象的创建         运行状态OLE对象的创建

──────────────────────────────────────

对象保存在运行文件中,增加了所需对象保存在一个文件中或只在运行时

编译的程序的规模       才有,减小了编译程序的规模 

开发者需在设计时访问OLE服务器   开发者不需要在设计时访问OLE服务器 

运行时OLE对象已经创建,减小了  运行时OLE对象已经创建,增加了运行

运行时间              时间 

OLE对象在设计运行时间可行性编辑  OLE对象只能在运行时编辑

应用程序的OLE对象数目在设计时已   应用程序可以在运行时创建新的OLE对

经确立                象

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

  在设计状态,OLE服务器不能被本地激活,只能在自己的窗体内激活。但在运行状态,

只要OLE服务器支持本地激活,就可以使用这种方式。 

8.1.4 OLE类、文件、项目 

  OLE类决定创建OLE对象的服务器。有些应用程序需要创建多种类型的OLE对象,例如应用程序同时链接或嵌入公式、图片等。OLE类也决定OLE对象所包含的数据类型,链接或嵌入对象均要定义OLE类。

  OLE文件是包含OLE对象数据的源文件。链接对象必须使用对象文件,因为链接对象在文件中保存。如果应用程序从已存在的源文件中创建嵌入对象,也要使用OLE文件。例如,如果链接到QuattiPro笔记本的OLE对象TUTOR.WBI存储在D:\DFFICE\QPW目录下,则OLE文件就是D:\DFFICE\QPW\TUTOR.WBI。值得注意的是OLE文件只能为链接对象所定义,而对于嵌入对象,只需定义OLE类。

  OLE项目是代表链接或嵌入数据的OLE文件中的一部分。当应用程序希望OLE对象包含比OLE文件小的数据块时,则必须使用OLE项目。

  例如,在QuattiPro笔记本中,OLE对象链接了GasCosts的B4到B5 范围的网格,OLE项目是$GasCosts;$B$4.$B$5。 

8.2 设计状态OLE对象的创建  

  Dephi可以在设计状态和运行状态中创建OLE对象。本节介绍设计状态OLE对象的创建。 

8.2.1 TOLEContainer部件 

  要创建OLE对象,需在窗体中加入OLE包容器部件。 应用程序部件包含链接或嵌入的对象。用该部件可显示在OLE服务器编辑的数据。部件的ObjClass,ObjDoc,ObjItem属性分别定义OLE类、文件、项目。要定义OLE对象是否本地激活,使用InPlaceActive属性。如果OLE对象可以本地激活,OLE服务器菜单将与OLE应用程序的菜单进行融合,GroupIndex属性的值将决定菜单融合情况。 

8.2.2 OLE对象创建的步骤: 

  1.在窗体中增加OLE包容器部件;

  2.在Object inspector中单击ObjClass或ObjDoc属性的省略按钮,将出现插入对象对话框;

        3.如果要插入的OLE对象已存储在文件中,选择“Creat FromFile”,而后定义该对象的文件名和路径名。如果是链接对象,则选择链接检查框。如果是嵌入对象,选择“Creat new”,并在对象类型列表框中选择OLE对象;

  4.选择OK按钮;

  如果是创建新对象,OLE服务器将激活,则可对OLE对象进行编辑,完成编辑后关闭OLE服务器。典型的例子是单击服务器中的“File”或“File|Update”菜单。

  5.此时ObjClass属性中包含了相应的值,如果OLE对象从已存在的文件中创建或插入一

个链接对象,ObjDoc属性包含了OLE文件。

  在设计对象状态时也可以粘贴OLE对象,其步骤如下:

  1.激活服务器应用程序,选择OLE包容器部件;

  2.在服务器中,将数据或对象拷贝到剪切板;

  3.进入Delphi集成开发环境,选择OLE包容器部件;

  4.在 Object inspector窗体中选择ObjItem属性的省略(…)按钮;

  5.在列表中选择OLE对象;

  6.选择“Paste"创建一个嵌入对象或选择"Pastelink"创建链接对象;

  7.选择OK。

OLE包容器部件在此时初始化。如果粘贴一个嵌入对象,ObjClass属性将包含适当的值。如果粘贴一链接对象,ObjClass,ObjDoc,ObjItem属性将全部定义。OLE 应用程序部件包含代表OLE对象的图片。

  如果OLE服务器程序支持OLE对象的拖放功能,则在设计状态从服务器中拖动对象至应用程序,应用程序将创建链接对象,具体步骤:

  1.激活服务器,并Delphi集成开放环境中选择要链接的对象;

  2.按隹鼠标左键拖动OLE对象至设计状态的窗体;

  3.松开鼠键释放OLE对象。

  窗体将创建OLE应用程序并进行初始化。 

8.3 OLE应用程序的开发 

  Delphi可以在设计状态和运行状态创建OLE对象,上一节介绍的是在设计状态如何创建OLE对象,这一节将通过例程介绍如何在运行状态创建OLE对象、粘贴对象、拖动对象,以及OLE 对象的文件操作。我们开发的 OLE.dpr是一个OLE应用程序的实例

8.3.1 OLE应用程序界面开发 

  OLE.dpr采用了多文档界面,父窗体有菜单,工具条,状态条,子窗体有一个OLE包容器部件,下面分别加以介绍。 

8.3.1.1 OLE应用程序的菜单 

  OLE应用程序的菜单与其它应用程序的主菜单大体一致,如果应用程序中有支持本地激活的OLE2.0对象,则要进行菜单融合。查阅OLE 服务器的资料可知道服务器是否支持本地激活。

  OLE应用程序菜单的GroupIndex属性决定融合菜单的位置,即融合菜单是更换主菜单,还是插入至应用程序的主菜单中。

  OLE服务器,将融合三组菜单:Edit,View,Help,每组菜单分配了唯一的组索引值。在OLE应用程序中任何索引值为1,3,5的菜单组在菜单融合时被OLE服务器中具有相应索引值的菜 单更换。在本例程中,编辑菜单项在菜单融合时被服务器的"Edit"替换。如图8.3。要想保存应用程序中的菜单,分配有异于1,3,5的索引值。

表8.3 融合后的菜单

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

菜单  索引值    功能描述       来源(OLE激活时)

────────────────────────────────

文件   0   使用文件和退出程序     OLE应用程序

Edit 1 编辑OLE对象         OLE服务器

对象   2 操作未激活的OLE对象     OLE应用程序

View 3 修改OLE对象的观测方式    OLE服务器

窗体  4 操纵窗体          OLE应用程序

Help 5 访问服务器在线帮助      OLE服务器

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 

8.3.1.2 OLE工具条和状态条 

  当OLE对象被本地激活时,OLE服务器将试图用自己的工具条和状态条替换OLE应用程序的。如果应用程序想要本地激活,就应该在应用程序中编写相应的代码让服务器使用工具条和状态条。要做到这点,必须:

  ● 设置工具条和状态条

  ● 在应用程序中加入状态条

   通过修改面板部件的属性创建工具条和状态条。

  当OLE对象被本地激活时,面板或其他对齐控制将与OLE服务器程序进行协调。 这意味

OLE服务器可以替换OLE应用程序窗体中任何对齐控制,但锁定的控制不能被替换。例如,

如果面板的align属性是alTop,alleft,alBottom,alIngh时,控制未锁定,OLE服务器可以替换。要使应用程序的工具条、状态条不被替换,可将locked属性设置成真值。

  当OLE 对象被激活,OLE 服务器在状态条中显示有关信息时,OLE 应用程序部件的OnStatusLineEvent事件发生,一个文本字符会将从OLE服务器传至该事件句柄。 OnStatusLineEvent事件句柄的MSG参数接受文本字符。

以下代码用以状态条接收OLE服务器的信息:

procedure TOLEObjectForm.OleContainerStatusLineEvent(Sender: TObject;

Msg: String);

begin

OLEFrameForm.StatusBarPanel.Caption := Msg

end; 

8.3.2 插入OLE对象 

         运行状态时进行对象链接与插入也要用到插入对话框,Delphi中没有插入对话框部件,但可调用InsertOLEObjectDlg函数来显示对话框。 

8.3.2.1 InsertOLEObjectDlg函数声明如下: 

function InsertOleObjectDlg(Form: TForm; HelpContext: THelpContext;

var PInitInfo: Pointer): Boolean;

  其中参数Form是拥有插入对话框的窗体,一般将拥有OLE包容器部件的窗体名字传给Form.

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

  参数PInitInfo是一个无类型指针,该指针指向一个包含初始化OLE部件信息的内部数据结构。InsertOLEObjectDlg修改这个指针以指向一个有效的数据结构,该结构包含了对话框列表中被选择的OLE对象初始化信息。当该指针被使用后,应调用ReleaseOLEInitInfo过程释放初始化信息所占用的内存。

  当用户选择OK 按钮关闭插入对象对话框,InsertOLEObjectDlg返回真值,并把 PInitInfo指向包含OLE对象的初始化信息的数据结构。 

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