⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 052.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基础教程-->第二十章 开发Delphi对象式数据管理功能(二)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基础教程 第二十章 开发Delphi对象式数据管理功能(二)">
<META NAME="description" CONTENT=" - DELPHI基础教程 - 第二十章 开发Delphi对象式数据管理功能(二)">

<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋体"}
.tt2 {font: 12pt/15pt "宋体"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0>
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%"  bgcolor="#e0e0e0"><strong><A HREF="053.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="051.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>

<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
<TD class="tt2" bgcolor="#F5F8F8" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷体_GB2312">第二十章 开发Delphi对象式数据管理功能(二)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<font face="Arial"><p>20.1.6 TResourceStream</font><font face="宋体" lang="ZH-CN">对象 </p>
<p>  </font><font face="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">对象是另一类</font><font
face="Arial">MemoryStream</font><font face="宋体" lang="ZH-CN">对象,它提供对</font><font
face="Arial">Windows </font><font face="宋体" lang="ZH-CN">应用程序资源的访问,因此称它为资源流。</font><font
face="Arial">TResourceSream</font><font face="宋体" lang="ZH-CN">也是从</font><font
face="Arial">TCustomMemoryStream </font><font face="宋体" lang="ZH-CN">继承的。因此在</font><font
face="Arial">TCustomMemoryStream</font><font face="宋体" lang="ZH-CN">对象的基础上,定义了与指定资源模块或资源文件建立连接的构造方法,并且还覆盖了</font><font
face="Arial">Write</font><font face="宋体" lang="ZH-CN">,以实现向资源文件中写数据。</font><font
face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">下面介绍</font><font face="Arial">TResourceStream</font><font
face="宋体" lang="ZH-CN">的实现</p>
<p>  </font><font face="Arial">1. </font><font face="宋体" lang="ZH-CN">私有域</p>
<p>  </font><font face="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">没有定义新的属性,但它在</font><font
face="Arial">private</font><font face="宋体" lang="ZH-CN">部分定义了两个数据域</font><font
face="Arial">HResInfo</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">HGlobol</font><font
face="宋体" lang="ZH-CN">和一个私有方法</font><font face="Arial">Initialize</font><font
face="宋体" lang="ZH-CN">,它们的定义如下:</p>
<p> </p>
<p></font><font face="Arial">TResourceStream = class(TCustomMemoryStream)</p>
<p>private</p>
<p>HResInfo: HRSRC;</p>
<p>HGlobal: THandle;</p>
<p>procedure Initialize(Instance: THandle; Name, ResType: PChar);</p>
<p></font><font face="宋体" lang="ZH-CN">…</p>
<p></font><font face="Arial">end;</p>
<p> </font><font face="宋体" lang="ZH-CN"></p>
<p>  </font><font face="Arial">HRSRC</font><font face="宋体" lang="ZH-CN">是描述</font><font
face="Arial">Windows</font><font face="宋体" lang="ZH-CN">资源信息的结构句柄。</font><font
face="Arial">HGlobal</font><font face="宋体" lang="ZH-CN">变量代表资源所在模块的句柄。如果操作的是应用程序资源,</font><font
face="Arial">HGlohal</font><font face="宋体" lang="ZH-CN">就代表</font><font
face="Arial">EXE</font><font face="宋体" lang="ZH-CN">程序的句柄;如果是动态链接库(</font><font
face="Arial">DLL</font><font face="宋体" lang="ZH-CN">),则</font><font face="Arial">HGlobal
</font><font face="宋体" lang="ZH-CN">代表动态链接库的句柄。</font><font
face="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">对象使用这两上变量访问应用程序或动态链接库中的资源。</p>
<p>  </font><font face="Arial">Initialize</font><font face="宋体" lang="ZH-CN">方法是</font><font
face="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">对象内部使用的。它的构造方法</font><font
face="Arial">Create</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">CreateFromID</font><font
face="宋体" lang="ZH-CN">都是调用</font><font face="Arial">Initialize</font><font
face="宋体" lang="ZH-CN">方法完成对</font><font face="Arial">TResourceStream</font><font
face="宋体" lang="ZH-CN">的初始化。它的实现如下:</p>
<p> </p>
<p></font><font face="Arial">procedure TResourceStream.Initialize(Instance: THandle; Name,
ResType: PChar);</p>
<p> </p>
<p>procedure Error;</font><font face="宋体" lang="ZH-CN"></p>
<p></font><font face="Arial">begin</font><font face="宋体" lang="ZH-CN"></p>
<p></font><font face="Arial">raise EResNotFound.Create(FmtLoadStr(SResNotFound, [Name]));</p>
<p>end;</p>
<p> </p>
<p>begin</p>
<p>HResInfo := FindResource(Instance, Name, ResType);</p>
<p>if HResInfo = 0 then Error;</p>
<p>HGlobal := LoadResource(Instance, HResInfo);</p>
<p>if HGlobal = 0 then Error;</p>
<p>SetPointer(LockResource(HGlobal), SizeOfResource(Instance, HResInfo));</p>
<p>end;</p>
<p> </p>
<p></font><font face="宋体" lang="ZH-CN"> 该方法实现中,首先调用</font><font
face="Arial">Windows</font><font face="宋体" lang="ZH-CN">函数</font><font
face="Arial">FoundResource</font><font face="宋体" lang="ZH-CN">得到由参数</font><font
face="Arial">Instance</font><font face="宋体" lang="ZH-CN">指定的模块中的名为</font><font
face="Arial">Name</font><font face="宋体" lang="ZH-CN">和类型为</font><font
face="Arial">ResType</font><font face="宋体" lang="ZH-CN">的资源,然后调用</font><font
face="Arial">LoadResource</font><font face="宋体" lang="ZH-CN">将资源调用内存,并返回该资源在内存中的句柄,最后,将该资源复制到</font><font
face="Arial">ResourceStream</font><font face="宋体" lang="ZH-CN">中。方法的</font><font
face="Arial">Instance</font><font face="宋体" lang="ZH-CN">参数代表要调用的资源所在的模块句柄。模块可以是可执行文件,也可以是动态链接库。如果在读取资源时没在模块中发现要找的资源则产生异常事件。</p>
<p>  </font><font face="Arial">2. </font><font face="宋体" lang="ZH-CN">构造方法</font><font
face="Arial">Create</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">CreateFromID</font><font
face="宋体" lang="ZH-CN"></p>
<p>  这两个方法在实现上没有大的不同。顾名思义,第一个方法是通过资源名构造</font><font
face="Arial">TResourceStream; </font><font face="宋体" lang="ZH-CN">第二个方法通过资源</font><font
face="Arial">ID</font><font face="宋体" lang="ZH-CN">构造</font><font face="Arial">TResourceStream</font><font
face="宋体" lang="ZH-CN">,而且在实现过程中,它们都调用了</font><font
face="Arial">Initialize</font><font face="宋体" lang="ZH-CN">方法。下面是它们的实现:</p>
<p> </p>
<p></font><font face="Arial">constructor TResourceStream.Create(Instance: THandle; const
ResName: string;</p>
<p>ResType: PChar);</p>
<p>begin</p>
<p>inherited Create;</p>
<p>Initialize(Instance, PChar(ResName), ResType);</p>
<p>end;</p>
<p> </p>
<p>constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer;</p>
<p>ResType: PChar);</p>
<p>begin</p>
<p>inherited Create;</p>
<p>Initialize(Instance, PChar(ResID), ResType);</p>
<p>end;</p>
<p> </font><font face="宋体" lang="ZH-CN"></p>
<p>  这两个方法中都有</font><font face="Arial">Instance</font><font
face="宋体" lang="ZH-CN">参数,该参数值的含义在</font><font face="Arial">Insitialize</font><font
face="宋体" lang="ZH-CN">中介绍过。</p>
<p>  </font><font face="Arial">3. Write</font><font face="宋体" lang="ZH-CN">方法</p>
<p>  </font><font face="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">的</font><font
face="Arial">Write</font><font face="宋体" lang="ZH-CN">方法只完成一件事,就产生这个异常事件,其实现如下:</p>
<p> </p>
<p></font><font face="Arial">function TResourceStream.Write(const Buffer; Count: Longint):
Longint;</p>
<p>begin</p>
<p>raise EStreamError.CreateRes(SCantWriteResourceStreamError);</p>
<p>end; </p>
<p> </font><font face="宋体" lang="ZH-CN"></p>
<p>  从方法实现中可以看到,</font><font face="Arial">TSourceStream</font><font
face="宋体" lang="ZH-CN">对象是不允许写数据的。一旦往资源流中写数据将产生异常事件。</p>
<p>  </font><font face="Arial">4. </font><font face="宋体" lang="ZH-CN">析构方法</font><font
face="Arial">Destroy</font><font face="宋体" lang="ZH-CN"></p>
<p>  该方法产生给资源解锁,然后释放该资源,最后调用继承的</font><font
face="Arial">Destroy</font><font face="宋体" lang="ZH-CN">方法释放</font><font
face="Arial">ResourceStream</font><font face="宋体" lang="ZH-CN">。其实现如下:</p>
<p> </p>
<p></font><font face="Arial">destructor TResourceStream.Destroy;</p>
<p>begin</font><font face="宋体" lang="ZH-CN"></p>
<p></font><font face="Arial">UnlockResource(HGlobal);</font><font face="宋体"
lang="ZH-CN"></p>
<p></font><font face="Arial">FreeResource(HResInfo);</p>
<p>inherited Destroy;</p>
<p>end;</p>
<p> </font><font face="宋体" lang="ZH-CN"></p>
<p>  回顾</font><font face="Arial">Initialize</font><font face="宋体" lang="ZH-CN">方法,我们不难发现:</p>
<p>  ●</font><font face="Arial"> ResourceStream</font><font face="宋体"
lang="ZH-CN">没有额外地给资源重新分配内存,而是直接使用</font><font
face="Arial">HGlobal</font><font face="宋体" lang="ZH-CN">句柄所指</font><font
face="Arial"> </font><font face="宋体" lang="ZH-CN">的内存域</p>
<p>  ●</font><font face="Arial"> ResourceStream</font><font face="宋体"
lang="ZH-CN">中的资源在流的生存期,始终是</font><font face="Arial">Lock</font><font
face="宋体" lang="ZH-CN">状态,因此要根据</font><font face="Arial">Windows </font><font
face="宋体" lang="ZH-CN">的内存使用规则合理安排</font><font face="Arial">ResourceStream</font><font
face="宋体" lang="ZH-CN">的使用</p>
<p>  ●</font><font face="Arial"> ResourceStream</font><font face="宋体"
lang="ZH-CN">只是用于访问应用程序和动态链接库中的资源的</p>
<p> </font><font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">在</font><font face="Arial">Classes</font><font
face="宋体" lang="ZH-CN">在单元中提供了</font><font face="Arial">InternalReadComponentRes</font><font
face="宋体" lang="ZH-CN">函数,该函数使用了</font><font face="Arial">TResourceStream</font><font
face="宋体" lang="ZH-CN">对象从</font><font face="Arial">Delphi</font><font
face="宋体" lang="ZH-CN">应用程序中读取部件。</font><font face="Arial">Delphi</font><font
face="宋体" lang="ZH-CN">是将窗体和部件信息放在模块资源的</font><font
face="Arial">RCDATA</font><font face="宋体" lang="ZH-CN">段的。</p>
<p> </font><font face="Arial"></p>
<p>20.1.7 TBlobStream</font><font face="宋体" lang="ZH-CN">对象</p>
<p> </p>
<p>  从</font><font face="Arial">Delphi </font><font face="宋体" lang="ZH-CN">数据库开发平台这个意义上说,</font><font
face="Arial">TBlobStream </font><font face="宋体" lang="ZH-CN">对象是个很重要的对象。</font><font
face="Arial">TBlobStream</font><font face="宋体" lang="ZH-CN">对象提供了修改</font><font
face="Arial">TBlobField</font><font face="宋体" lang="ZH-CN">、</font><font
face="Arial">TBytesField</font><font face="宋体" lang="ZH-CN">或</font><font
face="Arial">TVarBytesField</font><font face="宋体" lang="ZH-CN">中数据的技术。开发者可以象对待文件或流那样在数据库域中读写数据。</p>
<p>  传统数据库发展的一个重要趋向是往多媒体数据库发展。目前比较著名和流行的数据库都支持多媒体功能,多媒体数据存储中的一大难点是数据结构不规则,数据量大。各大数据库产品是采用</font><font
face="Arial">BLOB</font><font face="宋体" lang="ZH-CN">技术解决多媒体数据存储中的问题。</font><font
face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">TBlobStream</font><font

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -