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

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都覆盖了它,提供了具体实现。

时间: 2024-09-10 08:14:25

第二十章-开发Delphi对象式数据管理功能(三)(1)的相关文章

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

7. SetName方法和OnSetName事件 因为在OnSetName事件中,Name参数是var型的,所以可以用OnSetName事件处理过程修改所读部件的名字.而OnSetName事件处理过程是在SetName方法中实现的. procedure TReader.SetName(Component: TComponent; var Name: string); begin if Assigned(FOnSetName) then FOnSetName(Self, Component, Na

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

面向对象技术是九十年代的主流技术,各类应用软件如果以面向对象的方法构造并且渗透面向对象的风格将使软件具有更高的品质.在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特色. Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境.Delphi的核心是部件.部件是对象的一种.Delphi应用程序完全是由部件来构造的,因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术. 对象式数据管理包括两方面的内容: ● 用

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

20.1.1.2 TStream的实现原理 TStream对象是Stream对象的基础类,这是Stream对象的基础.为了能在不同媒介上的存储数据对象,后继的Stream对象主要是在Read和Write方法上做了改进,.因此,了解TStream是掌握Stream对象管理的核心.Borland公司虽然提供了Stream对象的接口说明文档,但对于其实现和应用方法却没有提及,笔者是从Borland Delphi 2.0 Client/Server Suite 提供的源代码和部分例子程序中掌握了流式对象

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

2. TWriter方法的实现 ⑴ WriteListBegin和WriteListEnd的实现 这两个方法都是用于写连续若干个相同类型的值.WriteListBegin写入VaList标志,WriteListEnd写入VaNull标志. procedure TWriter.WriteListBegin; begin WriteValue(vaList); end; procedure TWriter.WriteListEnd; begin WriteValue(vaNull); end; 这两

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

20.2.2.2 TWriter对象的实现 TWriter对象提供了许多往流中写各种类型数据的方法,这对于程序员来说是很重要的功能.TWrite对象往流中写数据是依据不同的数据采取不同的格式的. 因此要掌握TWriter对象的实现和应用方法,必须了解Writer对象存储数据的格式. 首先要说明的是,每个Filer对象的流中都包含有Filer对象标签.该标签占四个字节其值为"TPF0".Filer对象为WriteSignature和ReadSignature方法存取该标签.该标签主要用于

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

20.2.2.1 TWriter对象的属性和方法            1. Position属性      声明:property Position: Longint;       TWriter对象的Position属性表示相关联的流中的当前要写的位置,TReader       对象也有这个属性,但与TReader对象不同的是TWriter对象的Position的值比流的Position值小,这一点一看属性实现就清楚了.      2. RootAncesstor属性      声明:pr

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

20.2.1.2 TFiler对象的实现原理 TFiler对象是Filer对象的基础类,它定义的大多数方法都是抽象类型的,没有具体实现它,这些方法要在TReader和TWrite中覆盖.但它们提供了Filer对象的框架,了解它无疑是很重要的. 1. TFiler对象属性的实现 TFiler对象定义了三个属性:Root.Ancestor和IgnoreChildren.正如定义对象属性通常所采用的方法那样,要在private部分定义存储属性值的数据域,然后在public或Published部分定义该

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

⑶ 部件的写入 TWriter对象中与写入部件有关的方法有WriteSignature.WritePrefix.WriteComponent.WriteDescendant和WriteRootComponent. WriteSignature方法用于往流中写入Filer对象标签. procedure TWriter.WriteSignature; begin Write(FilerSignature, SizeOf(FilerSignature)); end; FilerStgnature是字符

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

4. 析构方法Destroy 该方法产生给资源解锁,然后释放该资源,最后调用继承的Destroy方法释放ResourceStream.其实现如下: destructor TResourceStream.Destroy; begin UnlockResource(HGlobal); FreeResource(HResInfo); inherited Destroy; end; 回顾Initialize方法,我们不难发现: ● ResourceStream没有额外地给资源重新分配内存,而是直接使用H