其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[3]


发布日期:2018年04月30日
 
DELPHI基础教程:开发Delphi对象式数据管理功能(一)[3]

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函数实现文件写操作其实现如下

[] [] [] [] []

               

上一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(一)[4]

下一篇:DELPHI基础教程:开发Delphi对象式数据管理功能(一)[2]