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

开发Delphi对象式数据管理功能(五)

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

20.2.1.1 TFiler对象的属性和方法 

  1. Root属性

  声明:property Root: TComponent;

Root 属性给Filer对象指出被读写的对象中哪一个对象是根或主要拥有者。RootComponent和WriteRootComponent方法在读和写部件及其拥有的部件前先设置Root的值。

  2. Ancestor属性

  声明:property Ancestor: TPersistent;

Ancestor属性用于往继承下来的窗体中写部件,因为当写部件时,Write对象只需要写入与所继承的部件不同的属性,所以在写之前要跟踪每个继承的部件,并且比较它们的属性。

  如果Ancestor为nil,就表示没有相应的继承的部件,Writer对象应当将部件完全写入流。Ancestor一般为nil,只有当调用WriteDescendant和WriteDescendantRes时,才给赋值。当编写和覆盖DefineProperties时,必须设置Ancestor的值。

  3. IgnoreChildren属性

  声明:property Ignorechildren: Boolean;

IgnoreChildren属性使一个Writer对象存储部件时可以不存储该部件拥有的部件。如果IgnoreChildren属性为True,则Writer对象存储部件不存它拥有的子部件。否则,Writer对象将所有其拥有的对象写入流。

  4. Create方法

  声明:constructor Create(Stream: TStream; BufSize:Cardinal);

 Create方法创建一个新的Filer对象,建立它和流Stream的联系;并且给它分配一个缓冲区Buffer。Buffer的大小由BufSize指定。

  5. Defineproperty方法

  声明:procedure Defineproperty(const Name: String;ReadData: TReaderProc;

WriteData: TWriterProc; HasData: Boolean); virtual; abstract;

Defineproperty方法定义Filer对象将作为属性存储的数据。Name参数描述接受的属性名,该属性不在published部分定义。ReadData和WriteData参数指定在存取对象时读和写所需数据的方法。HasData参数在运行时决定了属性是否有数据要存储。

  只有当对象有数据要存储时,才在该对象的DefineProperties中调用DefineProperty。DefineProperties有一个Filer对象作为它的参数,调用的就是该Filer对象的DefineProperty和DefineBinaryProperty方法。当定义属性时,Writer对象应当引用Ancestor属性,如果该属性非空,Writer对象应当只写入与从Ancestor继承的不同的属性的值。

  一个最简单的例子是TComponent的DefineProperties方法。尽管TComponent 没有在published中定义Left、Top属性,但该方法存储了部件的位置信息。

 

procedure TComponent.DefineProperties(Filer: TFiler);

begin

Filer.DefineProperty('Left', ReadLeft, WriteLeft, LongRec(FDesignInfo).Lo <> 0);

Filer.DefineProperty('Top', ReadTop, WriteTop, LongRec(FDesignInfo).Hi <> 0);

end;

 

6. DefineBinaryproperty方法

  声明:procedure DefineBinaryproperty(const Name:String;

ReadData, WriteData: TStreamProc;

HisData: Boolean); virtual; abstract;

DefineBinaryProperty方法定义Filer对象作为属性存储的二进制数据。Name参数描述属性名。ReadData和WriteData参数描述所存储的对象中读写所需数据的方法。HasData参数在运行时决定属性是否有数据要存。

  DefineBinaryProperty和DefineProperty方法的不同之处在于,二进制型的属性直接用Stream对象读写,而不是通过Filer对象。通过ReadData和WriteData传入的方法,直接将对象数据写入流或从流读出。

  DefineBinaryProperty属性用得较少。只有标准的VCL对象定义了象图形、图像之类的二进制属性的部件中才用它。

  7. FlushBuffer方法

  声明:procedure FlushBuffer; virtual: abstract;

FlushBuffer方法用于使Filer对象的缓冲区与相联的Stream对象同步。对Reader对象来说,是通过重新分配缓冲区;对于Writer对象是通过写入当前缓冲区。

  FlushBuffer是一个抽象方法,TReader和TWriter都覆盖了它,提供了具体实现。

 

20.2.1.2 TFiler对象的实现原理

 

  TFiler对象是Filer对象的基础类,它定义的大多数方法都是抽象类型的,没有具体实现它,这些方法要在TReader和TWrite中覆盖。但它们提供了Filer对象的框架,了解它无疑是很重要的。

  1. TFiler对象属性的实现

  TFiler对象定义了三个属性:Root、Ancestor和IgnoreChildren。正如定义对象属性通常所采用的方法那样,要在private部分定义存储属性值的数据域,然后在public或Published部分定义该属性,并按需要增加读写控制。它们的定义如下:

  

TFiler = class(TObject)

private

FRoot: TComponent;

FAncestor: TPersistent;

FIgnoreChildren: Boolean;

public

property Root: TComponent read FRoot write FRoot;

property Ancestor: TPersistent read FAncestor write FAncestor;

property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;

end;

 

  它们在读写控制上都是直接读写私有的数据域。

  在介绍TReader和TWriter的实现,我们还会看到这几个属性的原理介绍。

  2. TFiler对象方法的实现

  在TFiler对象定义的众多方法中很多都是抽象类方法,没有具体实现。在TFiler 的后继对象TReader中覆盖了这些方法。在后面章节,会介绍这些方法的实现。

  在TFiler对象中有具体实现的有两个方法Create和Destroy。

  ⑴ Create方法的实现

  Create方法是TFiler的构造方法,它有两个参数Stream和BufSize。Stream是指定与TFiler对象相联系的Stream对象,Filer对象都是用Stream对象完成具体的读写。BufSize是TFiler对象内部开设的缓冲区的大小。Filer对象内部开设缓冲区是为了加快数据的读写,它的实现如下:

 

constructor TFiler.Create(Stream: TStream; BufSize: Integer);

begin

FStream := Stream;

GetMem(FBuffer, BufSize);

FBufSize := BufSize;

end;

 

  FStream、FBuffer和FBufSize都是TFiler在private部分定义的数据域。FStream表示与Filer对象相联的Stream对象,FBuffer指向Filer对象内部开设的缓冲区,FBufSize是内部缓冲区的大小。Create方法用Stream参数值给FStream赋值,然后用GetMem分配BufSize大小的动态内存作为内部缓冲区。

  ⑵ Destroy方法的实现

  Destroy方法是TFiler对象的析构函数,它的作用就是释放动态内存。

 

destructor TFiler.Destroy;

begin

if FBuffer <> nil then FreeMem(FBuffer, FBufSize);

end;

 

20.2.2 TWriter对象

 

  TWriter 对象是可实例化的,往流中写数据的Filer对象。TWriter对象直接从TFiler继承而来,除了覆盖从TFiler继承的方法外,还增加了大量的关于写各种数据类型(如Integer、String和Component等)的方法。TWriter对象和TReader 对象配合使用将使对象读写发挥巨大作用。

 

20.2.2.1 TWriter对象的属性和方法

 

  1. Position属性

  声明:property Position: Longint;

TWriter对象的Position属性表示相关联的流中的当前要写的位置,TReader 对象也有这个属性,但与TReader对象不同的是TWriter对象的Position的值比流的Position值小,这一点一看属性实现就清楚了。

  2. RootAncesstor属性

  声明:property RootAncestor: TComponent;

RootAncestor属性表示的是Root属性所指的部件的祖先。如果Root 是继承的窗体,Writer对象将窗体拥有部件与祖先窗体中的相应部件依次比较,然后只写入那些与祖先中的不同的部件。

  3. Write方法

  声明:procedure Write(const Buf; Count: Longint);

Write方法从Buf中往与Writer相关联的流中写入Count个字节。

  4. WriteListBegin方法

  声明:procedure WriteListBegin;

WriteListBegin方法往Write对象的流中写入项目列表开始标志,该标志意味着后面存储有一连串的项目。Reader对象,在读这一连串项目时先调用ReadListBegin方法读取该标志位,然后用EndOfList判断是否列表结束,并用循环语句读取项目。在调用WriteListBegin方法的后面必须调用WriteListEnd方法写列表结束标志,相应的在Reader对象中有ReadListEnd方法读取该结束标志。

  5. WriteListEnd方法

  声明:procedure WriteListEnd;

WriteListEnd方法在流中,写入项目列表结束标志,它是与WriteListBegin相匹配的方法。

  6. WriteBoolean方法

  声明:procedure WriteBoolean(Value: Boolean);

WriteBoolean方法将Value传入的布尔值写入流中。

  7. WriteChar方法

  声明:procedure WriteChar(Value: char);

WriteChar方法将Value中的字符写入流中。

  8. WriteFloat方法

  声明:procedure WriteFloat(Value: Extended);

WriteFloat方法将Value传入的浮点数写入流中。

  9. WriteInteger方法

  声明:procedure WriteInteger(Value: Longint);

WriteInteger方法将Value中的整数写入流中。

  10. WriteString方法

  声明:procedure WriteString(const Value: string);

WriteString方法将Value中的字符串写入流中。

  11. WriteIdent方法

  声明:procedure WriteIdent(const Ident: string);

WriteIdent方法将Ident传入的标识符写入流中。

  12. WriteSignature方法

  声明:procedure WriteSignature;

WriteSignature方法将Delphi Filer对象标签写入流中。WriteRootComponent方法在将部件写入流之前先调用WriteSignature方法写入Filer标签。Reader对象在读部件之前调用ReadSignature方法读取该标签以指导读操作。

  13. WritComponent方法

  声明:procedure WriteComponent(Component:TComponent);

WriteComponent方法调用参数Component的WriteState方法将部件写入流中。在调用WriteState之前,WriteComponent还将Component的ComponetnState属性置为csWriting。当WriteState返回时再清除csWriting.

14. WriteRootComponent方法

  声明:procedure WriteRootComponent(Root:TComponent);

WriteRootComponent方法将Writer对象Root属性设为参数Root带的值,然后调用WriteSignature方法往流中写入Filer对象标签,最后调用WriteComponent方法在流中存储Root部件。

 

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