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属性决定融合菜单的位置,即融合菜单是更换主菜单,还是插入至应用程序的主菜单中。
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对象的初始化信息的数据结构。
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;
● 要将闻连与嵌入的对象显示成图标,选择"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);
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;
TOLEContainer部件的用法详解
最新推荐文章于 2019-02-21 16:19:30 发布
本文详细介绍在Delphi中处理OLE对象的过程,包括OLE包容器部件的使用、OLE对象的创建、编辑及文件操作等内容。文章提供了丰富的示例代码,帮助开发者掌握OLE对象的本地激活、菜单融合、工具条和状态条的定制等高级特性。
摘要由CSDN通过智能技术生成