Stream對象的WriteComponent方法聲明是這樣的
procedure WriteComponent(Instance: Tcomponent)
WriteComponent創建一個Writer對象並調用Writer的WriteRootComponent方法將Instance及其擁有的對象寫入流
WriteComponentRes方法
聲明
WriteComponentRes(const ResName: String; Instance: TComponent)
WriteComponentRes方法首先往流中寫入標准Windows 資源文件頭然後將Instance指定的部件寫入流中要讀由WriteComponentRes寫入的部件必須調用ReadComponentRes方法
WriteComponentRes使用ResName傳入的字符串作為資源文件頭的資源名然後調用WriteComponent方法將Instance和它擁有的部件寫入流
WriteDescendant方法
聲明
procedure WriteDescendant(Instance Ancestor: TComponent)
Stream對象的WriteDescendant方法創建一個Writer對象然後調入該對象的WriteDescendant方法將Instance部件寫入流中Instance可以是從Ancestor部件繼承的窗體也可以是在從祖先窗體中繼承的窗體中相應於祖先窗體中Ancestor部件的部件
WriteDescendantRes方法
聲明
procedure WriteDescendantRes(const ResName: String;Instance
Ancestor: TComponent)
WriteDescendantRes方法將Windows資源文件頭寫入流並使用ResName作用資源名然後調用WriteDescendant方法將Instance寫入流
TStream的實現原理
TStream對象是Stream對象的基礎類這是Stream對象的基礎為了能在不同媒介上的存儲數據對象後繼的Stream對象主要是在Read和Write方法上做了改進因此了解TStream是掌握Stream對象管理的核心Borland公司雖然提供了Stream對象的接口說明文檔但對於其實現和應用方法卻沒有提及筆者是從Borland Delphi Client/Server Suite 提供的源代碼和部分例子程序中掌握了流式對象技術
下面就從TStream的屬性和方法的實現開始
TStream屬性的實現
前面介紹過TStream具有Position和Size兩個屬性作為抽象數據類型它抽象了在各種存儲媒介中讀寫數據所需要經常訪問的域那麼它們是怎樣實現的呢?
在自定義部件編寫這一章中介紹過部件屬性定義中的讀寫控制Position和Size也作了讀寫控制定義如下
property Position: Longint read GetPosition write SetPosition;
property Size: Longint read GetSize;
由上可知Position是可讀寫屬性而Size是只讀的
Position屬性的實現就體現在GetPosition和SetPosition當在程序運行過程中任何讀取Position的值和給Position賦值的操作都會自動觸發私有方法GetPosition和SetPosition兩個方法的聲明如下
function TStreamGetPosition: Longint;
begin
Result := Seek( )
end;
procedure TStreamSetPosition(Pos: Longint)
begin
Seek(Pos )
end;
在設置位置時Delphi編譯機制會自動將Position傳為Pos
前面介紹過Seek的使用方法第一參數是移動偏移量第二個參數是移動的起點返回值是移動後的指針位置
Size屬性的實現只有讀控制完全屏蔽了寫操作讀控制方法GetSize實現如下
function TStreamGetSize: Longint;
var
Pos: Longint;
begin
Pos := Seek( )
Result := Seek( )
Seek(Pos )
end;
TStream方法的實現
⑴ CopyFrom方法
CopyFrom是Stream對象中很有用的方法它用於在不同存儲媒介中拷貝數據例如內存與外部文件之間內存與數據庫字段之間等它簡化了許多內存分配文件打開和讀寫等的細節將所有拷貝操作都統一到Stream對象上
前面曾介紹CopyFrom方法帶Source和Count兩個參數並返回長整型該方法將Count個字節的內容從Source拷貝到當前流中如果Count值為則拷貝所有數據
function TStreamCopyFrom(Source: TStream; Count: Longint) Longint;
const
MaxBufSize = $F;
var
BufSize N: Integer;
Buffer: PChar;
begin
if Count = then
begin
SourcePosition := ;
CouNG=ZHCN>資源文件中的部件時調用通常程序員不需自己調用如果讀取的不是資源文件ReadResHeader將觸發異常事件
procedure TStreamReadResHeader;
var
ReadCount: Longint;
Header: array[] of Char;
begin
FillChar(Header SizeOf(Header) )
ReadCount := Read(Header SizeOf(Header) )
if (Byte((@Header[])^) = $FF) and (Word((@Header[])^) = ) then
Seek(StrLen(Header + ) + ReadCount )
else
raise EInvalidImageCreateRes(SInvalidImage)
end;
ReadComponentRes在Windows資源文件中讀取部件為了判斷是否是資源文件它首先調用ReadResHeader方法然後調用ReadComponent方法讀取Instance指定的部件下面是它的實現
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25105.html