第二十章 开发Delphi对象式数据管理功能(三)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

20.2.1.1TFiler对象的属性和方法1.Root属性声明:propertyRoot:TComponent;Root属性给Filer对象指出被读写的对象中哪一个对象是根或主要拥有者。RootComponent和WriteRootComponent方法在读和写部件及其拥有的部件前先设置Root的值。2.Ancestor属性声明:propertyAncestor:TPersistent;Ancestor属性用于往继承下来的窗体中写部件,因为当写部件时,Write对象只需要写入与所继承的部件不同的属性,所以在写之前要跟踪每个继承的部件,并且比较它们的属性。如果Ancestor为nil,就表示没有相应的继承的部件,Writer对象应当将部件完全写入流。Ancestor一般为nil,只有当调用WriteDescendant和WriteDescendantRes时,才给赋值。当编写和覆盖DefineProperties时,必须设置Ancestor的值。3.IgnoreChildren属性声明:propertyIgnorechildren:Boolean;IgnoreChildren属性使一个Writer对象存储部件时可以不存储该部件拥有的部件。如果IgnoreChildren属性为True,则Writer对象存储部件不存它拥有的子部件。否则,Writer对象将所有其拥有的对象写入流。4.Create方法声明:constructorCreate(Stream:TStream;BufSize:Cardinal);Create方法创建一个新的Filer对象,建立它和流Stream的联系;并且给它分配一个缓冲区Buffer。Buffer的大小由BufSize指定。5.Defineproperty方法声明:procedureDefineproperty(constName: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属性,但该方法存储了部件的位置信息。procedureTComponent.DefineProperties(Filer:TFiler);beginFiler.DefineProperty('Left',ReadLeft,WriteLeft,LongRec(FDesignInfo).Lo0);Filer.DefineProperty('Top',ReadTop,WriteTop,LongRec(FDesignInfo).Hi0);end;6.DefineBinaryproperty方法声明:procedureDefineBinaryproperty(constName:String;ReadData,WriteData:TStreamProc;HisData:Boolean);virtual;abstract;DefineBinaryProperty方法定义Filer对象作为属性存储的二进制数据。Name参数描述属性名。ReadData和WriteData参数描述所存储的对象中读写所需数据的方法。HasData参数在运行时决定属性是否有数据要存。DefineBinaryProperty和DefineProperty方法的不同之处在于,二进制型的属性直接用Stream对象读写,而不是通过Filer对象。通过ReadData和WriteData传入的方法,直接将对象数据写入流或从流读出。DefineBinaryProperty属性用得较少。只有标准的VCL对象定义了象图形、图像之类的二进制属性的部件中才用它。7.FlushBuffer方法声明:procedureFlushBuffer;virtual:abstract;FlushBuffer方法用于使Filer对象的缓冲区与相联的Stream对象同步。对Reader对象来说,是通过重新分配缓冲区;对于Writer对象是通过写入当前缓冲区。FlushBuffer是一个抽象方法,TReader和TWriter都覆盖了它,提供了具体实现。20.2.1.2TFiler对象的实现原理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…propertyRoot:TComponentreadFRootwriteFRoot;propertyAncestor:TPersistentreadFAncestorwriteFAncestor;propertyIgnoreChildren:BooleanreadFIgnoreChildrenwriteFIgnoreChildren;end;它们在读写控制上都是直接读写私有的数据域。在介绍TReader和TWriter的实现,我们还会看到这几个属性的原理介绍。2.TFiler对象方法的实现在TFiler对象定义的众多方法中很多都是抽象类方法,没有具体实现。在TFiler的后继对象TReader中覆盖了这些方法。在后面章节,会介绍这些方法的实现。在TFiler对象中有具体实现的有两个方法Create和Destroy。⑴Create方法的实现Create方法是TFiler的构造方法,它有两个参数Stream和BufSize。Stream是指定与TFiler对象相联系的Stream对象,Filer对象都是用Stream对象完成具体的读写。BufSize是TFiler对象内部开设的缓冲区的大小。Filer对象内部开设缓冲区是为了加快数据的读写,它的实现如下:constructorTFiler.Create(Stream:TStream;BufSize:Integer);beginFStream:=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对象的析构函数,它的作用就是释放动态内存。destructorTFiler.Destroy;beginifFBuffernilthenFreeMem(FBuffer,FBufSize);end;20.2.2TWriter对象TWriter对象是可实例化的,往流中写数据的Filer对象。TWriter对象直接从TFiler继承而来,除了覆盖从TFiler继承的方法外,还增加了大量的关于写各种数据类型(如Integer、String和Component等)的方法。TWriter对象和TReader对象配合使用将使对象读写发挥巨大作用。20.2.2.1TWriter对象的属性和方法1.Position属性声明:propertyPosition:Longint;TWriter对象的Position属性表示相关联的流中的当前要写的位置,TReader对象也有这个属性,但与TReader对象不同的是TWriter对象的Position的值比流的Position值小,这一点一看属性实现就清楚了。2.RootAncesstor属性声明:propertyRootAncestor:TComponent;RootAncestor属性表示的是Root属性所指的部件的祖先。如果Root是继承的窗体,Writer对象将窗体拥有部件与祖先窗体中的相应部件依次比较,然后只写入那些与祖先中的不同的部件。3.Write方法声明:procedureWrite(constBuf;Count:Longint);Write方法从Buf中往与Writer相关联的流中写入Count个字节。4.WriteListBegin方法声明:procedureWriteListBegin;WriteListBegin方法往Write对象的流中写入项目列表开始标志,该标志意味着后面存储有一连串的项目。Reader对象,在读这一连串项目时先调用ReadListBegin方法读取该标志位,然后用EndOfList判断是否列表结束,并用循环语句读取项目。在调用WriteListBegin方法的后面必须调用WriteListEnd方法写列表结束标志,相应的在Reader对象中有ReadListEnd方法读取该结束标志。5.WriteListEnd方法声明:procedureWriteListEnd;WriteListEnd方法在流中,写入项目列表结束标志,它是与WriteListBegin相匹配的方法。6.WriteBoolean方法声明:procedureWriteBoolean(Value:Boolean);WriteBoolean方法将Value传入的布尔值写入流中。7.WriteChar方法声明:procedureWriteChar(Value:char);WriteChar方法将Value中的字符写入流中。8.WriteFloat方法声明:procedureWriteFloat(Value:Extended);WriteFloat方法将Value传入的浮点数写入流中。9.WriteInteger方法声明:procedureWriteInteger(Value:Longint);WriteInteger方法将Value中的整数写入流中。10.WriteString方法声明:procedureWriteString(constValue:string);WriteString方法将Value中的字符串写入流中。11.WriteIdent方法声明:procedureWriteIdent(constIdent:string);WriteIdent方法将Ident传入的标识符写入流中。12.WriteSignature方法声明:procedureWriteSignature;WriteSignature方法将DelphiFile

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功