TFiler对象的属性和方法
Root属性
声明
property Root: TComponent;
Root 属性给Filer对象指出被读写的对象中哪一个对象是根或主要拥有者RootComponent和WriteRootComponent方法在读和写部件及其拥有的部件前先设置Root的值
Ancestor属性
声明
property Ancestor: TPersistent;
Ancestor属性用于往继承下来的窗体中写部件因为当写部件时Write对象只需要写入与所继承的部件不同的属性所以在写之前要跟蹤每个继承的部件并且比较它们的属性
如果Ancestor为nil就表示没有相应的继承的部件Writer对象应当将部件完全写入流Ancestor一般为nil只有当调用WriteDescendant和WriteDescendantRes时才给赋值当编写和覆盖DefineProperties时必须设置Ancestor的值
IgnoreChildren属性
声明
property Ignorechildren: Boolean;
IgnoreChildren属性使一个Writer对象存储部件时可以不存储该部件拥有的部件如果IgnoreChildren属性为True则Writer对象存储部件不存它拥有的子部件否则Writer对象将所有其拥有的对象写入流
Create方法
声明
constructor Create(Stream: TStream; BufSize: Cardinal)
Create方法创建一个新的Filer对象建立它和流Stream的联系并且给它分配一个缓沖区BufferBuffer的大小由BufSize指定
Defineproperty方法
声明
procedure Defineproperty(const Name: String; ReadData: TReaderProc;WriteData: TWriterProc; HasData: Boolean)
virtual; abstract;
Defineproperty方法定义Filer对象将作为属性存储的数据Name参数描述接受的属性名该属性不在published部分定义ReadData和WriteData参数指定在存取对象时读和写所需数据的方法HasData参数在运行时决定了属性是否有数据要存储
只有当对象有数据要存储时才在该对象的DefineProperties中调用DefinePropertyDefineProperties有一个Filer对象作为它的参数调用的就是该Filer对象的DefineProperty和DefineBinaryProperty方法当定义属性时Writer对象应当引用Ancestor属性如果该属性非空Writer对象应当只写入与从Ancestor继承的不同的属性的值
一个最简单的例子是TComponent的DefineProperties方法尽管TComponent 没有在published中定义LeftTop属性但该方法存储了部件的位置信息
procedure TComponentDefineProperties(Filer: TFiler)
begin
FilerDefineProperty(Left ReadLeft WriteLeft LongRec(FDesignInfo)Lo <> )
FilerDefineProperty(Top ReadTop WriteTop LongRec(FDesignInfo)Hi <> )
end;
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对象定义了象图形图像之类的二进制属性的部件中才用它
FlushBuffer方法
声明
procedure FlushBuffer; virtual: abstract;
FlushBuffer方法用于使Filer对象的缓沖区与相联的Stream对象同步对Reader对象来说是通过重新分配缓沖区对于Writer对象是通过写入当前缓沖区
FlushBuffer是一个抽象方法TReader和TWriter都覆盖了它提供了具体实现
TFiler对象的实现原理
TFiler对象是Filer对象的基础类它定义的大多数方法都是抽象类型的没有具体实现它这些方法要在TReader和TWrite中覆盖但它们提供了Filer对象的框架了解它无疑是很重要的
TFiler对象属性的实现
TFiler对象定义了三个属性RootAncestor和IgnoreChildren正如定义对象属性通常所采用的方法那样要在private部分定义存储属性值的数据域然后在public或Published部分定义该属性并按需要增加读写控制它们的定义如下
TFiler = class(TObject)
private
…
FRoot: TComponent;
FAncestor: TPersistent;
FIgnoreChildren: Boolean;
public
…
property Root: TComponent read FRoot write FRoot;
property Ancestor: TPersistent read FAncestor write FAncestor;
property IgnoreChildren: Boolean read FIgnoreChildren write FIgnoreChildren;
end;
它们在读写控制上都是直接读写私有的数据域
在介绍TReader和TWriter的实现我们还会看到这几个属性的原理介绍
TFiler对象方法的实现
在TFiler对象定义的众多方法中很多都是抽象类方法没有具体实现在TFiler 的后继对象TReader中覆盖了这些方法在后面章节会介绍这些方法的实现
在TFiler对象中有具体实现的有两个方法Create和Destroy
⑴ Create方法的实现
Create方法是TFiler的构造方法它有两个参数Stream和BufSizeStream是指定与TFiler对象相联系的Stream对象Filer对象都是用Stream对象完成具体的读写BufSize是TFiler对象内部开设的缓沖区的大小Filer对象内部开设缓沖区是为了加快数据的读写它的实现如下
constructor TFilerCreate(Stream: TStream; BufSize: Integer)
begin
FStream := Stream;
GetMem(FBuffer BufSize)
FBufSize := BufSize;
end;
FStreamFBuffer和FBufSize都是TFiler在private部分定义的数据域FStream表示与Filer对象相联的Stream对象FBuffer指向Filer对象内部开设的缓沖区FBufSize是内部缓沖区的大小Create方法用Stream参数值给FStream赋值然后用GetMem分配BufSize大小的动态内存作为内部缓沖区
[] [] [] []