当前位置:七道奇文章资讯编程技术Delphi编程
日期:2011-03-20 17:55:00  来源:本站整理

<b>第二十章 开辟Delphi对象式数据管理功效(二)</b>[Delphi编程]

赞助商链接



  本文“<b>第二十章 开辟Delphi对象式数据管理功效(二)</b>[Delphi编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

20.1.6 TResourceStream对象 

  TResourceStream对象是另一类MemoryStream对象,它供应对Windows 利用程序资源的拜候,因此称它为资源流.TResourceSream也是从TCustomMemoryStream 担当的.因此在TCustomMemoryStream对象的底子上,定义了与指定资源模块或资源文件成立衔接的构造办法,并且还覆盖了Write,以实现向资源文件中写数据.

下面介绍TResourceStream的实现

  1. 私有域

  TResourceStream没有定义新的属性,但它在private部份定义了两个数据域HResInfoHGlobol和一个私有办法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对象内部利用的.它的构造办法CreateCreateFromID都是调用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. 构造办法CreateCreateFromID

  这两个办法在实现上没有大的差别.顾名思义,第一个办法是通过资源名构造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办法

  TResourceStreamWrite办法只完成一件事,就产生这个非常事件,其实现以下:

 

function TResourceStream.Write(const Buffer; Count: Longint): Longint;

begin

raise EStreamError.CreateRes(SCantWriteResourceStreamError);

end;

 

  从办法实现中可以看到,TSourceStream对象是不答应写数据的.一旦往资源流中写数据将产生非常事件.


  以上是“<b>第二十章 开辟Delphi对象式数据管理功效(二)</b>[Delphi编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .