DELPHI经典编程入门(8).pdf
《DELPHI经典编程入门(8).pdf》由会员分享,可在线阅读,更多相关《DELPHI经典编程入门(8).pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Delphi园地 http:/ 第八章 对象链接与嵌入(一)第八章 对象链接与嵌入(一)对象链接和嵌入(Object Linking and Embeding)是一组服务功能,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。对象可以是几乎所有的信息类型,如文字、位图、矢量图形,甚至于声音注解和录像剪辑等。Windows附件组中的书写器是应用OLE的实例,使用单击“对象|插入”菜单项,书写器弹出插入对话框,对话框中列出了多个OLE服务器程序,如公式编辑工具,绘图工具,报表生成工具。用户双击鼠标左键,可激活一个OLE服务器。在OLE服务器中可编辑OLE对象,当用户返回到书写器中时,在
2、书写器文档中将出现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)激活方式。
3、本地激活意味着服务器菜单与应用程序菜单要进行融合,服务器的状态条更换应用程序状态条,服务器的工具条更换应用程序工具条。OLE对象在应用程序窗体中进行编辑,但所有过程均由服务器处理。创建OLE对象的服务器决定了OLE的激活方式。如果一个OLE1.0的对象在OLE2.0 编译的应用程序中打开,它将采用OLE1.0的方式。8.1.2 链接与嵌入 链接对象的数据保存在OLE服务器创建的文件中,嵌入对象的数据保存在OLE应用程序中。链接对象必须以文件形式保存,只有对OLE服务器已经创建好的OLE对象,才能进行OLE链接,链接的OLE对象文件可被OLE应用程序或其它程序进行修改,OLE 服务器和其它OLE
4、应用程序也可以访问和修改OLE对象。对象数据保存在某一处,但可以被多个应用程序访问。Delphi应用程序可以得到OLE对象文件中的最新数据。当OLE 对象数据被应用程序修改时,这些变化将在所有包含该对象的其它应用程序中体现。嵌入对象保存在OLE应用程序中,其它应用程序不能访问该对象。只有在OLE应用程序中激活OLE对象才能对其进行编辑。嵌入的OLE对象不需要保存在文件中,所有数据都在应用程序中,这就确保了OLE数据不会被偶然地删除或修改。不足之处是应用程序的规模因为保存了OLE数据而增大了。如果用户想保存对嵌入对象的修改,可以把OLE数据存入文件中,本章第3 节将详细讨论这个问题。表8.1 使
5、用链接或嵌入的原则。何时使用链接 何时使用嵌入 想要对源对象进行修改及将 对源对象进行修改,并将这 这些修改反映到其他与源对 些修改反映在一个特定的应 页码,1/19第八章 对象链接与嵌入(一)象链接的应用程序或文本中 用程序或文本中 源对象可能被多个OLE应 源对象不可能被一个OLE应 用程序应用程序频繁修改 用程序频繁修改 源对象的文件不会被频繁移 源对象的文件可能被频繁移 动,且不会被删除 动,且不会被删除 对象很大,一般通过网络或 对象很小,或对象很大却无法 电子邮件进行分配 通过网络或电子邮件进行分配 8.1.3 设计状态OLE对象的创建 在Delphi中,可分别在设计状态或运行状态
6、创建OLE对象,表8.2说明了两种状态创建对象的差别。表8.2 设计、运行状态OLE对象的创建 设计状态OLE对象的创建 运行状态OLE对象的创建 对象保存在运行文件中,增加了所需 对象保存在一个文件中或只在运行时 编译的程序的规模 才有,减小了编译程序的规模 开发者需在设计时访问OLE服务器 开发者不需要在设计时访问OLE服务器 运行时OLE对象已经创建,减小了 运行时OLE对象已经创建,增加了运行 运行时间 时间 OLE对象在设计运行时间可行性编辑 OLE对象只能在运行时编辑 应用程序的OLE对象数目在设计时已 应用程序可以在运行时创建新的OLE对 经确立 象 在设计状态,OLE服务器不能
7、被本地激活,只能在自己的窗体内激活。但在运行状态,只要OLE服务器支持本地激活,就可以使用这种方式。8.1.4 OLE类、文件、项目 OLE类决定创建OLE对象的服务器。有些应用程序需要创建多种类型的OLE对象,例如应用程序同时链接或嵌入公式、图片等。OLE类也决定OLE对象所包含的数据类型,链接或嵌入对象均要定义OLE类。OLE文件是包含OLE对象数据的源文件。链接对象必须使用对象文件,因为链接对象在文件中保存。如果应用程序从已存在的源文件中创建嵌入对象,也要使用OLE文件。例如,如果链接到QuattiPro笔记本的OLE对象TUTOR.WBI存储在D:DFFICEQPW目录下,则OLE文件
8、就是D:DFFICEQPWTUTOR.WBI。值得注意的是OLE文件只能为链接对象所定义,而对于嵌入对象,只需定义OLE类。页码,2/19第八章 对象链接与嵌入(一)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 TOLEContaine
9、r部件 要创建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.如
10、果要插入的OLE 对象已存储在文件中,选择“Creat From File”,而后定义该对象的文件名和路径名。如果是链接对象,则选择链接检查框。如果是嵌入对象,选择“Creat new”,并在对象类型列表框中选择OLE对象;4.选择OK按钮;如果是创建新对象,OLE服务器将激活,则可对OLE对象进行编辑,完成编辑后关闭OLE服务器。典型的例子是单击服务器中的“File”或“File|Update”菜单。5.此时ObjClass属性中包含了相应的值,如果OLE对象从已存在的文件中创建或插入一 个链接对象,ObjDoc属性包含了OLE文件。在设计对象状态时也可以粘贴OLE对象,其步骤如下:1.激活
11、服务器应用程序,选择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对象的拖放功能,则
12、在设计状态从服务器中拖动对象至应用程序,应用程序将创建链接对象,具体步骤:1.激活服务器,并Delphi集成开放环境中选择要链接的对象;2.按隹鼠标左键拖动OLE对象至设计状态的窗体;页码,3/19第八章 对象链接与嵌入(一)3.松开鼠键释放OLE对象。窗体将创建OLE应用程序并进行初始化。8.3 OLE应用程序的开发 Delphi可以在设计状态和运行状态创建OLE对象,上一节介绍的是在设计状态如何创建OLE对象,这一节将通过例程介绍如何在运行状态创建OLE对象、粘贴对象、拖动对象,以及OLE 对象的文件操作。我们开发的 OLE.dpr是一个OLE应用程序的实例 8.3.1 OLE应用程序界面
13、开发 OLE.dpr采用了多文档界面,父窗体有菜单,工具条,状态条,子窗体有一个OLE包容器部件,下面分别加以介绍。8.3.1.1 OLE应用程序的菜单 OLE应用程序的菜单与其它应用程序的主菜单大体一致,如果应用程序中有支持本地激活的OLE 2.0对象,则要进行菜单融合。查阅OLE 服务器的资料可知道服务器是否支持本地激活。OLE应用程序菜单的GroupIndex属性决定融合菜单的位置,即融合菜单是更换主菜单,还是插入至应用程序的主菜单中。OLE服务器,将融合三组菜单:Edit,View,Help,每组菜单分配了唯一的组索引值。在OLE应用程序中任何索引值为1,3,5的菜单组在菜单融合时被O
14、LE服务器中具有相应索引值的菜 单更换。在本例程中,编辑菜单项在菜单融合时被服务器的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服务器将试图用自己
15、的工具条和状态条替换OLE应用程序的。如果应用程序想要本地激活,就应该在应用程序中编写相应的代码让服务器使用工具条和状态条。要做到这点,必须:设置工具条和状态条 在应用程序中加入状态条 通过修改面板部件的属性创建工具条和状态条。当OLE对象被本地激活时,面板或其他对齐控制将与OLE服务器程序进行协调。这意味 页码,4/19第八章 对象链接与嵌入(一)OLE服务器可以替换OLE应用程序窗体中任何对齐控制,但锁定的控制不能被替换。例如,如果面板的align属性是alTop,alleft,alBottom,alIngh时,控制未锁定,OLE服务器可以替换。要使应用程序的工具条、状态条不被替换,可将l
16、ocked属性设置成真值。当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对象
17、运行状态时进行对象链接与插入也要用到插入对话框,Delphi中没有插入对话框部件,但可调用InsertOLEObjectDlg 函数来显示对话框。8.3.2.1 InsertOLEObjectDlg函数声明如下:function InsertOleObjectDlg(Form:TForm;HelpContext:THelpContext;var PInitInfo:Pointer):Boolean;其中参数Form是拥有插入对话框的窗体,一般将拥有OLE包容器部件的窗体名字传给Form.参数Helplontext为插入对象对话框定义在线帮助,如果应用程序没有在线帮助,HelpContext的值
18、为零,对话框中将不出现帮助按钮。参数PInitInfo是一个无类型指针,该指针指向一个包含初始化OLE 部件信息的内部数据结构。InsertOLEObjectDlg修改这个指针以指向一个有效的数据结构,该结构包含了对话框列表中被选择的OLE 对象初始化信息。当该指针被使用后,应调用ReleaseOLEInitInfo过程释放初始化信息所占用的内存。当用户选择OK 按钮关闭插入对象对话框,InsertOLEObjectDlg 返回真值,并把 PInitInfo指向包含OLE对象的初始化信息的数据结构。8.3.2.2 初始化OLE包容器部件 为了使OLE包容器部件包含OLE对象,必须对部件进行初始
19、化。初始化主要是定义部件的OLE类。如果定义了OLE文件和OLE项目,初始化完成后,OLE 应用程序部件将包含OLE对象。调用InsertOLEObjetDlg函数可在其参数PInitInfo获得关于OLE对象初始化的信息时,把它传递给OLE包容器部件的PInitInfo属性,OLE包容部件的ObjClass,ObjDoc,ObjItem属性将被自动定义。初始化完成后,OLE对象被击活。OLE服务器将获得控制,用户可通过OLE服务器对OLE对象进行编辑。当程序冻结OLE对象,OLE包容器部件将包含一幅图像或位图代表OLE对象。定义OLE包容器部件的AutoActive属性可重新激活OLE对象,
20、缺省情况下,双击OLE包容器部件可击活OLE对象。例程中初始OLE对象的代码如下:procedure TOLEObjectForm.InitializeOLEObject(Info:Pointer);begin 页码,5/19第八章 对象链接与嵌入(一)OLEContainer.PInitInfo:=Info;ReleaseOLEInitInfo(Info)end;该过程先将初始化指针传给OLE包容器部件的PInitInfo属性,而后释放其内存空间。当用户单击例程中的“编辑|插入”菜单项,将弹出插入对象对话框,选择对象类型后,OLE对象被激活,该过程的代码如下:procedure TOLEOb
21、jectForm.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服务器将进行菜单融合,并转换工具条和状态条。要冻结对象,
22、只需在应用程序窗体中异于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对象粘贴到
23、OLE包容器部件,要使用粘贴对话框,Delphi 中没有粘贴对话框部件,但可用PasteSpecialDlg函数显示粘贴对话框。PasteSpecialDlg 函数声明如下:function PasteSpecialDlg(Form:TForm;Const First:arrang;HelpConcert:THelpCOntext;var Forrmat:Word;var Hardle:THanlle var PInitInfo:Point):Boolean;页码,6/19第八章 对象链接与嵌入(一)PasteSpecialDlg参数定义如下:参数Form是拥有粘贴对话框的窗体,应把包含OLE
24、包容器部件的窗体名字传递给Form。参数Format是注册对象格式的数组,每组格式是BOLEFormat类型的数组成员。例如应用程序可注册两种对象格式。为嵌入对象注册FEmbedClipFmt,为链接对象注册FlinkClipFmt。BOLEFormat 声明如下:BOLEFormat:Record fmtID:Word;fmtName:array0.31 of char;fmtResultName:array0.31 of char;fmtMediun:BOleMedium;fmIsLInkble:Bool;end;fmtID是对象的剪贴板格式ID号,fmtID 可以是标准的剪贴板格式:CF
25、_TEXT,CF_BIFMAP。使用OLE 对象时,需注册新的剪贴板格式来处理OLE 对象。Windows的API中 的RegisterClipbordFormat函数注册格式。fmtName表示是对象的名字,用以定义出现在粘贴对话框中列表框 内的对象名称。在例程中,把“S”匹配给fmtName,OLE服务器自动地把格式化的名字代替“S”参数。例如,如果OLE服务器是画笔,在程序运行时“Paintbrush Picture Object”将代替“S”。fmtResultName,定义出现在粘贴对话框中结果检查框内的名字。在例程中,把“S”传给了fmtResultName。OLE服务器自动地把格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DELPHI 经典 编程 入门
限制150内