Delphi 对象链接与嵌入

2016-02-19 17:49 13 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐Delphi 对象链接与嵌入,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

  对象链接和嵌入(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服务器采用本地(in place)激活方式。本地激活意味着服务器菜单与应用程序菜单要进行融合,服务器的状态条更换应用程序状态条,服务器的工具条更换应用程序工具条。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:DFFICEQPW目录下,则OLE文件就是D:DFFICEQPWTUTOR.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 From File,而后定义该对象的文件名和路径名。如果是链接对象,则选择链接检查框。 如果是嵌入对象,选择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应用程序的菜单与其它应用程序的主菜单大体一致,如果应用程序中有支持本地激活的OLE 2.0对象,则要进行菜单融合。查阅OLE 服务器的资料可知道服务器是否支持本地激活。

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

  表8.3 融合后的菜单

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

  菜单  索引值    功能描述       

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

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

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

  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);beginOLEContainer.PInitInfo := Info;ReleaseOLEInitInfo(Info)end;

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

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

  

procedure TOLEObjectForm.InsertObject1Click(Sender: TObject);varInfo: Pointer;beginif InsertOLEObjectDlg(OLEFrameForm, 0, Info) thenInitializeOLEObject(Info);end;

  8.3.3 冻结OLE对象 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

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

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

  标键即可。

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

  

procedure TOLEObjectForm.Deactivate1Click(Sender: TObject);beginOLEContainer.Active := Falseend;
 

  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: RecordfmtID : 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;

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

  ● 如果数据不是注册的格式,"Paste","Paste link"选择键将变灰。 用户无法从剪贴板上粘贴数据。在本章例程中,剪贴板上的数据只能是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);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类的私有数据成员。 声明如下:

来源:https://www.tulaoshi.com/n/20160219/1616116.html

延伸阅读
如果你想要有类似主页那样指向某字体,该字体就出现下划线,鼠标指针变为一支手指,按下后就打开浏览器或邮件编写器的功能,请按下列办法做(该方法只是在前面讲的实现超链接的方法上加入一些效果): 先在一个窗体中加入一个Label1,在OnMouseMove事件里加入下列代码 procedure TForm1.Label1MouseMove(Sender: TObject;shift:...
标签: Delphi
这个看似神奇的功能,不需用第三方VCL组件就能搞定(据网上的“大牛”们说,第三方组件用多了,大脑会因长期得不到思考而逐渐退化成大猩猩的程度,所以尽量少用)。TRichEidt是Delphi提供的一个非常有用的VCL组件(你可以在Delphi的组件面板的Win32标签页中找到它),它提供了一个文本编辑程序的大部分的功能,甚至还可以对段落进行格式...
Delphi的编程语言是以Pascal为基础的。Pascal语言具有可读性好、编写容易的特点,这使得它很适合作为基础的开发语言。同时,使用编译器创建的应用程序只生成单个可执行文件(.EXE),正是这种结合,使得Pascal成为Delphi这种先进开发环境的编程语言。 本章中,我们将讨论Object Pascal的主要特点,并讲解如何在事件处理过程和其他应用程...
标签: Delphi
  2.1.4 跳转语句 Object Pascal的跳转语句有 if 和 case两个。 2.1.4.1 if语句         if语句会计算一个表达式,并根据计算结果决定程序流程。在上文的例程中,根据 ColorDialog.Execute 的返回值,决定窗体的背景颜色。 if 保留字后跟随一个生成 Boolean 值 True或 False 的表达式...
标签: Delphi
  Delphi 的编程语言是以 Pascal为基础的。 Pascal 语言具有可读性好、编写容易的特点,这使得它很适合作为基础的开发语言。同时,使用编译器创建的应用程序只生成单个可执行文件 (.EXE) ,正是这种结合,使得 Pascal 成为 Delphi这种先进开发环境的编程语言。         本章中,我们将讨论 Object...

经验教程

608

收藏

42
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部