庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>Delphi语言>基础教程>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

Delphi 对象链接与嵌入(三)

 作者:本站收集   日期:2005-3-29
字号选择〖 〗/ 双击滚屏 单击停止   

8.3.5.2 在应用程序中释放OLE对象 

  当一个对象释放到一个窗体,该窗体发生OnDragDrop 事件。该对象定义为TDragDropEvent方法中的Source参数,而TDragDropEvent 方法是用来处理OnDragDrop事件”。 如果Source 是一个OLE 对象, 那么它是TOLEDropNotify 对象的派生类型。 TOLEDropNotify对象有一个与OLE包容器部件PInitInfo属性相对应的PIniInfo属性。 如果一个OLE对象被释放。PInitInfo指向OLE对象的初始化信息结构。要实现释放功能。只需将TOLEDropNotifyPInitInfo属性赋给OLE包容器部件的PInitInfo属性。

  以下为处理OnDragDrop事件的代码: 

procedure TOLEFrameForm.FormDragDrop(Sender, Source: TObject; X,

Y: Integer);

var

NewChild: TOLEObjectForm;

begin

if Source is TOLEDropNotify then

begin

NewChild := CreateChild;

with Source as TOLEDropNotify do

NewChild.OLEContainer.PInitInfo := PInitInfo

end

end; 

注意不要用ReleaseOLEInitInfo释放分配给PInitInfo属性的内存Delphi自动释放这块内存。 

8.3.6 文件中的OLE对象 

  在OLE应用程序中,要保存对OLE对象的修改,需将对象数据保存在文件中。 如果对象是链接的数据Delphi将自动的保存在源文件中。当对象被修改时,文件中的数据自动修改。 如果对象是嵌入的,数据贮存在应用程序程序的窗体。要保存对嵌入对象的修改, 应用程序应把数据保存在特殊的OLE文件中。如果要对已存文件的对象进行编辑,应用程序必须从文件中装入OLE对象。

  OLE包容器部件的SaveToFile方法可保存对象: 

  OleCntainer1.SaveToFile('C: \SALEs.OLE'); 

  OLE包容器部件的loadFromFile方法可把文件中的对象装入OLE包容器部件。 

  OleContainer1.loadFromFile('C:\SALEs.OLE')

  本章例程使用了保存对话框和打开对话框来实现运行状态的对象保存和对象装入。

  在OLEObjectForm窗体加入保存对话框部件和打开对话框部件。其主要属性如表8.4: 

  表8.4 保存对话框的属性及取值:

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

 属性        值

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

  Name SaveAsDialog

DefaultExit ole

FileName .OLE

Filter OLE files (*.OLE)|*.OLE

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

8.5 打开对话框的属性及取值

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

  属性        取值

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

  Name OpenDialog

DefaultExit ole

FileName .OLE

Filter OLE files (*.OLE)|*.OLE

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

  用户单击“文件|保存”菜单项实现OLE对象的保存。代码如下: 

procedure TOLEObjectForm.SaveAs1Click(Sender: TObject);

begin

if SaveAsDialog.Execute then

OLEContainer.SaveToFile(SaveAsDialog.Filename)

end; 

用户单击“文件|打开”菜单项实现对象文件装入: 

procedure TOLEFrameForm.Open1Click(Sender: TObject);

var

NewChild: TOLEObjectForm;

begin

f OpenDialog.Execute then

begin

NewChild := CreateChild;

NewChild.OLEContainer.LoadFromFile(OpenDialog.FileName)

end

end;

   8.4 OLE自动化 

  OLE自动化是Windows应用程序操纵另一个程序的一种机制。OLE 2.0提供了一种方法来集成应用程序,这就是应用程序之间的命令操作。

  利用OLE 2.0,程序员可以定义一组命令,使它们进入到其它程序中。这些命令可带参数。看起来很象应用程序在调用函数或过程一样。采用上述办法, 可以在人不参与的情况下,就能使得两个应用程序的相互作用。

  被自动化的程序称作自动化对象或自动化服务器, 操作或自动化其他程序的应用程序称为自动化控制器或自动化客户器。

  Delphi2.0完全支持OLE2.0的应用程序自动化,可以用Delphi 2.0编写自动化控制器和服务

器。在应用程序之间可编程的潜能是巨大的。用户可以创建宏或者其它命令, 使得某个应用程序能透过其它应用程序进行工作。已经存在的应用程序的宏语言很容易被扩展,它可以包括一组别的应用程序能够执行的命令和函数调用。

   现在介绍两个应用程序,其中MemoEdit.dpr 是多文档界面的文本编辑器,作为OLE自动化服务器,AutoFrom.dpr是自动化控制器。运行AutoForm前,在Delphi集成开发环境中单击菜单(run | parameters),Delphi弹出运行参数对话框,如图8.5,输入参数后运行状态如图8.6AutoForm窗体的多个按钮。可对MemoEdit进行操作;如按Creat按钮,MemoEdit产生三个子窗体,如图8.7,按"AddText",子窗体将出现"This text was added through OLE Automation"字符串“

MemoEdit包括三个单元:

  Mainfrom MDI主窗体

  EditFrom MDE子窗体和自动化类

  MemoAuto 应用程序自动化对象

  下面结合例程讲述OLE自动化的基本概念及开发。 

8.4.1 TAutoObject对象 

  TAutoObject Delphi自动化服务器中所有对象的基类,任何自动化对象都是从TAutoObject类派生出来的。

  OLE对象的定义与其它类的定义类似。它的automated部分象普通类的public部分,OLE控制器可引用在这部分声明的属性和方法。编译器把automated部分创建成OLE自动化对象的入口。但automated部分的代码有很多限制:

  ● 属性方法可以定义,但不能定义域;

  ● 所有属性、参数、函数类型必须是以下类型之一: 

  SmallInt,Integer,Single,Double,Currency,TDateTime,String,WordBool, Varint 

属性声明只能包括访问定义符(read and Write),其它定义符如index,stored,

default,odefault均不能使用;

  ● 访问定义符必须列出相应的方法标识符,不能使用域标识符;

  ● 支持数组类型;

  ● 不允许属性重载;

  ● 方法是可以是虚拟的,但不能是动态的,允许方法重载。

  在EditFrom单元中定义了TMemoDoc类: 

  type

TMemoDoc = Class(TAutoObject)

private

FEditForm : TEditForm;

funtion CretFileName : String;

funtion CretModiFied : WordBool;

procedure SetFileName(Const Value : String);

automated

procedure Clear;

procedure Ineart(Const Text : String);

procedure Save;

procedure Close;

procedure FileName : String read GretFileName write

SetFileName;

procedure Modified : WordBool read GretModified

end; 

        TMemeDoc类是MemoEdit程序的内部自动化类,因此不需要注册。外部OLE自动化控制器对它不能直接引用。如果要使外部控制器对自动化对象进行操作,则要在声明自动化对象的单元中调用Automation. RegisterClass 进行注册。例程MemoAuto 单元定义了TMemoApp对象并进行注册。 

  unit MemoAuto

 

type

TMemoApp = Class(TAutoObject)

implementation

  procedure RegisterMemoApp

Const

AutoClassInfo : TAutoClassInfo = (

AutoClass : TMemoApp;

ProgID : MemoEdit,Application

ClassIn : '{FIFF4880 - 200D - 11CF - BDCF - D020AFOE5B81}';

Description : 'Memo Editor Application';

Instancing : acSingle Instance );

begin

Automation,RegisterClass(AutoClassInfo)

end;

inibialization

RegisterMemoApp;

end; 

        自动化对象要在initialization部分中对自动化对象进行注册。 注册的信息用以唯一辨识服务器对象。把一个自动化对象加入到服务器中要用到这些信息。程序一旦注册了自动化对象,全局自动化对象将用OLE自动化API进行自动管理。

  注册后的OLE自动化对象是引用记数的,因为对象可能被多个控制器控制。当使用完一个OLE对象,调用Release方法,Release可减少引用数目,当引用数目为零时,调用Free方法释放对象。

  通常把OLE对象作为变体类型(variants)进行输出,任何OLE 对象的方法和属性必须返回一个包含OLE对象的变体类型,TAutoObject提供了一个变体类型的OLEObject属性。控制器不能直接得到服务器中的类或指针,而是引用OLE对象的OLEObject属性。

  例程MemoAuto单元的NewMemo函数就是通过引用OLEObject 属性而提供引用TMemoDoc对象的接口。 

  function TMemoApp,NewMemo : Variant;

begin

Result := MainForm,CreateMemo(' '),OleObject;

end; 

上一篇:Delphi 对象链接与嵌入(四)    下一篇:Delphi 对象链接与嵌入(二)  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-3-29
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿