首页 / 软件开发 / Delphi / 第二十章-开发Delphi对象式数据管理功能(四)(3)
第二十章-开发Delphi对象式数据管理功能(四)(3)2007-05-072. Defineproperty和DefineBinaryproperty方法的实现这两个方法是虚方法,在TFiler中是抽象方法,在TReader和TWriter对象中才有具体的实现。它们在TReader中的实现如下:procedure TReader.DefineProperty(const Name: string; ReadData: TReaderProc; WriteData: TWriterProc; HasData: Boolean);beginif CompareText(Name, FPropName) = 0 thenbeginReadData(Self);FPropName := "";end;end;procedure TReader.DefineBinaryProperty(const Name: string;ReadData, WriteData: TStreamProc; HasData: Boolean);varStream: TMemoryStream;Count: Longint;beginif CompareText(Name, FPropName) = 0 thenbeginif ReadValue <> vaBinary thenbeginDec(FBufPos);SkipValue;FCanHandleExcepts := True;PropValueError;end;Stream := TMemoryStream.Create;tryRead(Count, SizeOf(Count));Stream.SetSize(Count);Read(Stream.Memory^, Count);FCanHandleExcepts := True;ReadData(Stream);finallyStream.Free;end;FPropName := "";end;end;在两个方法都将Name参数值与当前的属性名比较,如果相同则进行读操作。在DefineBinaryproperty中,创建了一个内存流。先将数据读到内存流中然后调用ReadData读取数据。3. FlushBuffer的实现FlushBuffer方法用于清除Reader对象的内部缓冲区中的内容,保持Reader对象和流在位置(Position)上的同步,其实现如下:procedure TReader.FlushBuffer;beginFStream.Position := FStream.Position - (FBufEnd - FBufPos);FBufPos := 0;FBufEnd := 0;end;4. ReadListBegin、ReadListEnd和EndOfList方法这三个方法都是用于从Reader对象的流中读取一连串的项目,并且这些项目都由WriteListBegin写入的标志标定开始和WriteListEnd写入标志,标定结束,在读循环中用EndOfList进行判断。它们是在Reader对象读取流中数据时经常用于的。它们的实现如下:procedure TReader.ReadListBegin;beginCheckValue(vaList);end;procedure TReader.ReadListEnd;beginCheckValue(vaNull);end;function TReader.EndOfList: Boolean;beginResult := ReadValue = vaNull;Dec(FBufPos);end;项目表开始标志是VaList,项目表结束标志是VaNull,VaList和VaNull都是枚举类型TValueType定义的常量。它们实现中调用的CheckValue是TReader的私有方法,其实现如下:procedure TReader.CheckValue(Value: TValueType);beginif ReadValue <> Value thenbeginDec(FBufPos);SkipValue;PropValueError;end;end;CheckValue方法的功能是检测紧接着要读的值是否是Value指定的类型。如果不是则跳过该项目并触发一个SInvalidPropertyValue错误。EndOfList函数只是简单地判断下一字节是否是VaNull将判断结果返回,并将字节移回原来位置。