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大小的動態內存作為內部緩沖區
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25096.html