<b>第二十章 开辟Delphi对象式数据管理功效(二)</b>[Delphi编程]
本文“<b>第二十章 开辟Delphi对象式数据管理功效(二)</b>[Delphi编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
20.1.6 TResourceStream对象
TResourceStream对象是另一类MemoryStream对象,它供应对Windows 利用程序资源的拜候,因此称它为资源流.TResourceSream也是从TCustomMemoryStream 担当的.因此在TCustomMemoryStream对象的底子上,定义了与指定资源模块或资源文件成立衔接的构造办法,并且还覆盖了Write,以实现向资源文件中写数据.
下面介绍TResourceStream的实现
1. 私有域
TResourceStream没有定义新的属性,但它在private部份定义了两个数据域HResInfo和HGlobol和一个私有办法Initialize,它们的定义以下:
TResourceStream = class(TCustomMemoryStream)
private
HResInfo: HRSRC;
HGlobal: THandle;
procedure Initialize(Instance: THandle; Name, ResType: PChar);
…
end;
HRSRC是描写Windows资源信息的构造句柄.HGlobal变量代表资源所在模块的句柄.假如操作的是利用程序资源,HGlohal就代表EXE程序的句柄;假如是动态链接库(DLL),则HGlobal 代表动态链接库的句柄.TResourceStream对象利用这两上变量拜候利用程序或动态链接库中的资源.
Initialize办法是TResourceStream对象内部利用的.它的构造办法Create和CreateFromID都是调用Initialize办法完成对TResourceStream的初始化.它的实现以下:
procedure TResourceStream.Initialize(Instance: THandle; Name, ResType: PChar);
procedure Error;
begin
raise EResNotFound.Create(FmtLoadStr(SResNotFound, [Name]));
end;
begin
HResInfo := FindResource(Instance, Name, ResType);
if HResInfo = 0 then Error;
HGlobal := LoadResource(Instance, HResInfo);
if HGlobal = 0 then Error;
SetPointer(LockResource(HGlobal), SizeOfResource(Instance, HResInfo));
end;
该办法实现中,首先调用Windows函数FoundResource得到由参数Instance指定的模块中的名为Name和范例为ResType的资源,然后调用LoadResource将资源调用内存,并返回该资源在内存中的句柄,最后,将该资源复制到ResourceStream中.办法的Instance参数代表要调用的资源所在的模块句柄.模块可以是可履行文件,也可以是动态链接库.假如在读取资源时没在模块中发现要找的资源则产生非常事件.
2. 构造办法Create和CreateFromID
这两个办法在实现上没有大的差别.顾名思义,第一个办法是通过资源名构造TResourceStream; 第二个办法通过资源ID构造TResourceStream,并且在实现历程中,它们都调用了Initialize办法.下面是它们的实现:
constructor TResourceStream.Create(Instance: THandle; const ResName: string;
ResType: PChar);
begin
inherited Create;
Initialize(Instance, PChar(ResName), ResType);
end;
constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer;
ResType: PChar);
begin
inherited Create;
Initialize(Instance, PChar(ResID), ResType);
end;
这两个办法中都有Instance参数,该参数值的含义在Insitialize中介绍过.
3. Write办法
TResourceStream的Write办法只完成一件事,就产生这个非常事件,其实现以下:
function TResourceStream.Write(const Buffer; Count: Longint): Longint;
begin
raise EStreamError.CreateRes(SCantWriteResourceStreamError);
end;
从办法实现中可以看到,TSourceStream对象是不答应写数据的.一旦往资源流中写数据将产生非常事件.
以上是“<b>第二十章 开辟Delphi对象式数据管理功效(二)</b>[Delphi编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |