function TStreamReadComponentRes(Instance: TComponent) TComponent;
begin
ReadResHeader;
Result := ReadComponent(Instance)
end;
与ReadComponentRes相应的写方法是WriteComponentResDelphi 调用这两个方法读写窗体文件(DFM文件)在后面书中会举用这两个方法读取DFM文件的例子
⑷ WriteComponent和WriteDescendant方法
Stream对象的WriteDescendant方法在实现过程中创建了TWriter对象然后利用TWriter的WriteDescendant方法将Instance写入流而WriteComponent方法只是简单地调用WriteDescendant方法将Instance写入流它们的实现如下
procedure TStreamWriteComponent(Instance: TComponent)
begin
WriteDescendent(Instance nil)
end;
procedure TStreamWriteDescendent(Instance Ancestor: TComponent)
var
Writer: TWriter;
begin
Writer := TWriterCreate(Self )
try
WriterWriteDescendent(Instance Ancestor)
finally
WriterFree;
end;
end;
⑸ WriteDescendantRes和WriteComponentRes方法
WriteDescendantRes方法用于将部件写入Windows资源文件而WriteComponentRes 方法只是简单地调用WriteDescendantRes方法它们的实现如下
procedure TStreamWriteComponentRes(const ResName: string; Instance:
TComponent)
begin
WriteDescendentRes(ResName Instance nil)
end;
procedure TStreamWriteDescendentRes(const ResName: string; Instance
Ancestor: TComponent)
var
HeaderSize: Integer;
Origin ImageSize: Longint;
Header: array[] of Char;
begin
Byte((@Header[])^) := $FF;
Word((@Header[])^) := ;
HeaderSize := StrLen(StrUpper(StrPLCopy(@Header[] ResName ))) + ;
Word((@Header[HeaderSize ])^) := $;
Longint((@Header[HeaderSize ])^) := ;
WriteBuffer(Header HeaderSize)
Origin := Position;
WriteDescendent(Instance Ancestor)
ImageSize := Position Origin;
Position := Origin ;
WriteBuffer(ImageSize SizeOf(Longint))
Position := Origin + ImageSize;
end;
WriteCompnentRes是与ReadComponentRes相应的对象写方法这两个方法相互配合可读取Delphi的DFM文件从而利用Delphi系统的功能
THandleStream对象
THandleStream对象的行为特别象FileStream对象所不同的是它通过已创建的文件句柄而不是文件名来存储流中的数据
THandleStream对象定义了Handle属性该属性提供了对文件句柄的只读访问并且Handle属性可以作为Delphi的RTL文件管理函数的参数利用文件类函数来读写数据THandleStream覆盖了构造函数Create该函数带有Handle 参数该参数指定与THandleStream对象相关的文件句柄
THandleStream的属性的方法
Handle属性
声明
property Handle: Integer;
Handle属性提供了对文件句柄的只读访问该句柄由THandleStream的构造方法Create传入因此除了用THandleStream提供的方法外也可以用文件管理函数对句柄进行操作实际上THandleStream的方法在实现上也是运用文件管理函数进行实际的读写操作
Create方法
声明
constructor Create(AHandle: Integer)
Create方法使用传入的Handle参数创建一个与特定文件句柄相联的THandleStream对象并且将AHandle赋给流的Handle属性
ReadWrite和Seek方法
这三个方法是TStream的虚方法只是在THandleStream 中覆盖了这三个方法以实现特定媒介──文件的数据存取后面会详细介绍这三个方法的实现
THandleStream的实现原理
THandleStream是从TStream继承来的因此可以共用TStream中的属性和大多数方法THandleStream在实现上主要是增加了一个属性Handle和覆盖了CreateReadWrite和Seek四个方法
属性的实现
Handle属性的实现正如Delphi大多数属性的实现那样先在对象定义的private部分声明一个存放数据的变量FHandle然后在定义的public部分声明属性Handle其中属性定义的读写控制部分加上只读控制读控制只是直接读取FHandle变量的值其实现如下
THandleStream = class(TStream)
private
FHandle: Integer;
public
…
property Handle: Integer read FHandle;
end;
方法的实现
THandleStream的Create方法以AHandle作为参数在方法里面只是简单的将AHandle的值赋给FHandle其实现如下
constructor THandleStreamCreate(AHandle: Integer)
begin
FHandle := AHandle;
end;
为实现针对文件的数据对象存储THandleStream的ReadWrite和Seek方法覆盖了TStream中的相应方法它们的实现都调用了Windows的文件管理函数
Read方法调用FileRead函数实现文件读操作其实现如下
function THandleStreamRead(var Buffer; Count: Longint) Longint;
begin
Result := FileRead(FHandle Buffer Count)
if Result = then Result := ;
end;
Write方法调用FileWrite函数实现文件写操作其实现如下
[] [] [] [] []