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

2. Defineproperty和DefineBinaryproperty方法的实现

这两个方法是虚方法,在TFiler中是抽象方法,在TReader和TWriter对象中才有具体的实现。

它们在TReader中的实现如下:

procedure TReader.DefineProperty(const Name: string; ReadData: TReaderProc;

WriteData: TWriterProc; HasData: Boolean);

begin

if CompareText(Name, FPropName) = 0 then

begin

ReadData(Self);

FPropName := '';

end;

end;

procedure TReader.DefineBinaryProperty(const Name: string;

ReadData, WriteData: TStreamProc; HasData: Boolean);

var

Stream: TMemoryStream;

Count: Longint;

begin

if CompareText(Name, FPropName) = 0 then

begin

if ReadValue <> vaBinary then

begin

Dec(FBufPos);

SkipValue;

FCanHandleExcepts := True;

PropValueError;

end;

Stream := TMemoryStream.Create;

try

Read(Count, SizeOf(Count));

Stream.SetSize(Count);

Read(Stream.Memory^, Count);

FCanHandleExcepts := True;

ReadData(Stream);

finally

Stream.Free;

end;

FPropName := '';

end;

end;

在两个方法都将Name参数值与当前的属性名比较,如果相同则进行读操作。在DefineBinaryproperty中,创建了一个内存流。先将数据读到内存流中然后调用ReadData读取数据。

3. FlushBuffer的实现

FlushBuffer方法用于清除Reader对象的内部缓冲区中的内容,保持Reader对象和流在位置(Position)上的同步,其实现如下:

procedure TReader.FlushBuffer;

begin

FStream.Position := FStream.Position - (FBufEnd - FBufPos);

FBufPos := 0;

FBufEnd := 0;

end;

4. ReadListBegin、ReadListEnd和EndOfList方法

这三个方法都是用于从Reader对象的流中读取一连串的项目,并且这些项目都由WriteListBegin写入的标志标定开始和WriteListEnd写入标志,标定结束,在读循环中用EndOfList进行判断。它们是在Reader对象读取流中数据时经常用于的。它们的实现如下:

procedure TReader.ReadListBegin;

begin

CheckValue(vaList);

end;

procedure TReader.ReadListEnd;

begin

CheckValue(vaNull);

end;

function TReader.EndOfList: Boolean;

begin

Result := ReadValue = vaNull;

Dec(FBufPos);

end;

项目表开始标志是VaList,项目表结束标志是VaNull,VaList和VaNull都是枚举类型TValueType定义的常量。

它们实现中调用的CheckValue是TReader的私有方法,其实现如下:

procedure TReader.CheckValue(Value: TValueType);

begin

if ReadValue <> Value then

begin

Dec(FBufPos);

SkipValue;

PropValueError;

end;

end;

CheckValue方法的功能是检测紧接着要读的值是否是Value指定的类型。如果不是则跳过该项目并触发一个SInvalidPropertyValue错误。

EndOfList函数只是简单地判断下一字节是否是VaNull将判断结果返回,并将字节移回原来位置。

时间: 2024-10-22 23:42:23

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

第二十章-开发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对象式数据管理功能(四)(1)

20.2.3 TReader对象 TReader对象是可实例化的用于从相联系的流中读取数据的Filer对象.TReader对象从TFiler继承下来,除了从TFiler继承的属性和方法外,TReader声明了不少属性.方法和事件. Owner和Parent属性用于表示从Reader对象的流中读取的部件的拥有者和双亲结点.OnError,OnFindMethod和OnSetName事件使应用程序在运行中读数据时能定制响应方式.除了覆盖了一些从TFiler对象中继承的方法外,TReader对象还定义

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

6. 读取部件的方法的实现 Reader对象中用于读取部件的方法有ReadSignature.ReadPrefix.ReadComponent.ReadRootComponent和ReadComponents. ReadSignature方法主要用于读取Delphi Filer对象标签一般在读取部件前,都要用调用ReadSignature方法以指导部件读写过程. procedure TReader.ReadSignature; var Signature: Longint; begin Read

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

5. 简单数据类型读方法的实现 简单数据类型指的是布尔型.字符型.整型.字符串型.浮点型.集合类型和标识符.将它们放在一起介绍是因为它们的实现方法类似. 因为它们的实现都用到了ReadValue方法,因此先来介绍ReadValue方法的实现: function TReader.ReadValue: TValueType; begin Read(Result, SizeOf(Result)); end; 该方法调用私有方法Read,从Reader对象流中读一个字节,并移动位置指针. ReadVal

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

14. OnError事件 声明:property OnError: TReaderError; 当Reader对象读取数据出错时将引发OnError事件.通过处理OnError事件,可以有选择地处理或忽略错误. 传给OnError事件处理过程的最后一个参数是名为Handled的var参数.在缺省情况下,Error方法将Handled置为True.这将阻止错误更进一步处理.如果事件处理过程仍旧将Handled置为False,Reader对象将引发一个EReadError异常事件. 15. Set

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

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

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

20.3.2.4 BLOB字段与Stream对象 因为Delphi中,BLOB字段是通过BLOB流来访问的,所以可以很容易地在BLOB字段和Stream对象之间传递数据.为此,TBlobField对象提供了LoadFromStream和SaveToStream方法. procedure TBlobField.LoadFromStream(Stream: TStream); var BlobStream: TBlobStream; begin BlobStream := TBlobStream.C