⑵ Destroy方法的实现
Destroy方法是TFiler对象的析构函数它的作用就是释放动态内存
destructor TFilerDestroy;
begin
if FBuffer <> nil then FreeMem(FBuffer FBufSize)
end;
TWriter对象
TWriter 对象是可实例化的往流中写数据的Filer对象TWriter对象直接从TFiler继承而来除了覆盖从TFiler继承的方法外还增加了大量的关于写各种数据类型(如IntegerString和Component等)的方法TWriter对象和TReader 对象配合使用将使对象读写发挥巨大作用
TWriter对象的属性和方法
Position属性
声明
property Position: Longint;
TWriter对象的Position属性表示相关联的流中的当前要写的位置TReader 对象也有这个属性但与TReader对象不同的是TWriter对象的Position的值比流的Position值小这一点一看属性实现就清楚了
RootAncesstor属性
声明
property RootAncestor: TComponent;
RootAncestor属性表示的是Root属性所指的部件的祖先如果Root 是继承的窗体Writer对象将窗体拥有部件与祖先窗体中的相应部件依次比较然后只写入那些与祖先中的不同的部件
Write方法
声明
procedure Write(const Buf; Count: Longint)
Write方法从Buf中往与Writer相关联的流中写入Count个字节
WriteListBegin方法
声明
procedure WriteListBegin;
WriteListBegin方法往Write对象的流中写入项目列表开始标志该标志意味着后面存储有一连串的项目Reader对象在读这一连串项目时先调用ReadListBegin方法读取该标志位然后用EndOfList判断是否列表结束并用循环语句读取项目在调用WriteListBegin方法的后面必须调用WriteListEnd方法写列表结束标志相应的在Reader对象中有ReadListEnd方法读取该结束标志
WriteListEnd方法
声明
procedure WriteListEnd;
WriteListEnd方法在流中写入项目列表结束标志它是与WriteListBegin相匹配的方法
WriteBoolean方法
声明
procedure WriteBoolean(Value: Boolean)
WriteBoolean方法将Value传入的布尔值写入流中
WriteChar方法
声明
procedure WriteChar(Value: char)
WriteChar方法将Value中的字符写入流中
WriteFloat方法
声明
procedure WriteFloat(Value: Extended)
WriteFloat方法将Value传入的浮点数写入流中
WriteInteger方法
声明
procedure WriteInteger(Value: Longint)
WriteInteger方法将Value中的整数写入流中
WriteString方法
声明
procedure WriteString(const Value: string)
WriteString方法将Value中的字符串写入流中
WriteIdent方法
声明
procedure WriteIdent(const Ident: string)
WriteIdent方法将Ident传入的标识符写入流中
WriteSignature方法
声明
procedure WriteSignature;
WriteSignature方法将Delphi Filer对象标签写入流中WriteRootComponent方法在将部件写入流之前先调用WriteSignature方法写入Filer标签Reader对象在读部件之前调用ReadSignature方法读取该标签以指导读操作
WritComponent方法
声明
procedure WriteComponent(Component: TComponent)
WriteComponent方法调用参数Component的WriteState方法将部件写入流中在调用WriteState之前WriteComponent还将Component的ComponetnState属性置为csWriting当WriteState返回时再清除csWriting
WriteRootComponent方法
声明
procedure WriteRootComponent(Root: TComponent)
WriteRootComponent方法将Writer对象Root属性设为参数Root带的值然后调用WriteSignature方法往流中写入Filer对象标签最后调用WriteComponent方法在流中存储Root部件
TWriter对象的实现
TWriter对象提供了许多往流中写各种类型数据的方法这对于程序员来说是很重要的功能TWrite对象往流中写数据是依据不同的数据采取不同的格式的 因此要掌握TWriter对象的实现和应用方法必须了解Writer对象存储数据的格式
首先要说明的是每个Filer对象的流中都包含有Filer对象标签该标签占四个字节其值为TPFFiler对象为WriteSignature和ReadSignature方法存取该标签该标签主要用于Reader对象读数据(部件等)时指导读操作
其次Writer对象在存储数据前都要留一个字节的标志位以指出后面存放的是什么类型的数据该字节为TValueType类型的值TValueType是枚举类型占一个字节空间其定义如下
TValueType = (VaNull VaList VaInt VaInt VaInt VaEntended VaString VaIdent
VaFalse VaTrue VaBinary VaSet VaLString VaNil VaCollection)
因此对Writer对象的每一个写数据方法在实现上都要先写标志位再写相应的数据而Reader对象的每一个读数据方法都要先读标志位进行判断如果符合就读数据否则产生一个读数据无效的异常事件VaList标志有着特殊的用途它是用来标识后面将有一连串类型相同的项目而标识连续项目结束的标志是VaNull因此在Writer对象写连续若干个相同项目时先用WriteListBegin写入VaList标志写完数据项目后再写出VaNull标志而读这些数据时以ReadListBegin开始ReadListEnd结束中间用EndofList函数判断是否有VaNull标志
下面就介绍它们的实现
TWriter对象属性的实现
TWriter对象直接从TFiler对象继承它只增加了Position和RootAncestor属性
RootAncestor属性在private部分有数据域FRootAncestor存入其值在属性定义的读与控制上都是直接读取该值
[] [] [] []