第二十章开发delphi对象式数据管理功能四内容摘要:

的实现。 它们在 TReader 中的实现如下: procedure (const Name: string。 ReadData: TReaderProc。 WriteData: TWriterProc。 HasData: Boolean)。 begin if CompareText(Name, FPropName) = 0 then begin ReadData(Self)。 FPropName := 39。 39。 end。 end。 procedure (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 :=。 try Read(Count, SizeOf(Count))。 (Count)。 Read(^, Count)。 FCanHandleExcepts := True。 ReadData(Stream)。 finally。 end。 FPropName := 39。 39。 end。 end。 在两个方法都将 Name 参数值与当前的属性名比较,如果相同则进行读操作。 在 DefineBinaryproperty 中,创建了一个内存流。 先将数据读到内存流中然后调用 ReadData 读取数据。 3. FlushBuffer 的实现 FlushBuffer 方法用于清除 Reader 对象的内部缓冲区中的内容,保持Reader 对象和流在位置( Position)上的同步,其实现如下: procedure。 begin := (FBufEnd FBufPos)。 FBufPos := 0。 FBufEnd := 0。 end。 4. ReadListBegin、 ReadListEnd 和 EndOfList 方法 这三个方法都是用于从 Reader 对象的流中读取一连串的项目,并且这些项目都由 WriteListBegin 写入的标志标定开始和 WriteListEnd 写入标志,标定结束,在读循环中用 EndOfList 进行判断。 它们是在 Reader 对象读取流中数据时经常用于的。 它们的实现如下: procedure。 begin CheckValue(vaList)。 end。 procedure。 begin CheckValue(vaNull)。 end。 function : Boolean。 begin Result := ReadValue = vaNull。 Dec(FBufPos)。 end。 项目表开始标志是 VaList,项目表结束标志是 VaNull, VaList 和 VaNull 都是枚举类型 TValueType 定义的常量。 它们实现中调用的 CheckValue 是 TReader 的私有方法,其实现如下: procedure (Value: TValueType)。 begin if ReadValue Value then begin Dec(FBufPos)。 SkipValue。 PropValueError。 end。 end。 CheckValue 方法的功能是检测紧接着要读的值是否是 Value 指定 的类型。 如果不是则跳过该项目并触发一个 SInvalidPropertyValue 错误。 EndOfList 函数只是简单地判断下一字节是否是 VaNull 将判断结果返回,并将字节移回原来位置。 5. 简单数据类型读方法的实现 简单数据类型指的是布尔型、字符型、整型、字符串型、浮点型、集合类型和标识符。 将它们放在一起介绍是因为它们的实现方法类似。 因为它们的实现都用到了 ReadValue 方法,因此先来介绍 ReadValue 方法的实现: function : TValueType。 begin Read(Result, SizeOf(Result))。 end。 该方法调用私有方法 Read,从 Reader 对象流中读一个字节,并移动位置指针。 ReadValue 方法专门从流中读取值的类型的,所有的数据读写方法中在读取数据前都要调用 ReadValue 方法判断是否是所要读的数据。 如果是,则调用Read 方法读取数据;否则触发一个异常事件,下面看 Integer 类型的读方法: function : Longint。 var S: Shortint。 I: Smallint。 begin case ReadValue of vaInt8: begin Read(S, SizeOf(Shortint))。 Result := S。 end。 vaInt16: begin Read(I, SizeOf(I))。 Result := I。 end。 vaInt32: Read(Result, SizeOf(Result))。 else PropValueError。 end。 end。 因为 Delphi 中,整型可分 8 位 、 16 位和 32 位,因此读取整型数据时分别作了判断。 布尔类型的数据是直接放在值类型标志上,如果类型为 VaTrue,则值为True;如果类型为 VaFalse,则值为 False。 function : Boolean。 begin Result := ReadValue = vaTrue。 end。 ReadString 方法也利用 ReadValue 方法判断是字符串还是长字符串。 function : string。 var L: Integer。 begin L := 0。 case ReadValue of vaString: Read(L, SizeOf(Byte))。 vaLString: Read(L, SizeOf(Integer))。 else PropValueError。 end。 SetString(Result, PChar(nil), L)。 Read(Pointer(Result)^, L)。 end。 如果 VaString 类型紧接着一个字节存有字符串的长度;如果是 VaLString 类,则紧接着两 个字节存放字符串长度,然后根据字符串长度用 SetString 过程给分配空间,用 Read 方法读出数据。 ReadFloat 方法允许将整型值转换为浮点型。 function : Extended。 begin if ReadValue = vaExtended then Read(Result, SizeOf(Result)) else begin Dec(FBufPos)。 Result := ReadInteger。 end。 end。 字符类型数据设有直接的标 志,它是根据 VaString 后面放一个序值为 1 的字节来判断的。 function : Char。 begin CheckValue(vaString)。 Read(Result, 1)。 if Ord(Result) 1 then begin Dec(FBufPos)。 ReadStr。 P。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。