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

📄 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"  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%"  ><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></strong></TD><TD class="tt2"  width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="隶书">第二十章 开发Delphi对象式数据管理功能(二)</FONT></B></center><hr  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><fontface="Arial">MemoryStream</font><font face="宋体" lang="ZH-CN">对象,它提供对</font><fontface="Arial">Windows </font><font face="宋体" lang="ZH-CN">应用程序资源的访问,因此称它为资源流。</font><fontface="Arial">TResourceSream</font><font face="宋体" lang="ZH-CN">也是从</font><fontface="Arial">TCustomMemoryStream </font><font face="宋体" lang="ZH-CN">继承的。因此在</font><fontface="Arial">TCustomMemoryStream</font><font face="宋体" lang="ZH-CN">对象的基础上,定义了与指定资源模块或资源文件建立连接的构造方法,并且还覆盖了</font><fontface="Arial">Write</font><font face="宋体" lang="ZH-CN">,以实现向资源文件中写数据。</font><fontface="Arial"></p><p></font><font face="宋体" lang="ZH-CN">下面介绍</font><font face="Arial">TResourceStream</font><fontface="宋体" 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><fontface="Arial">private</font><font face="宋体" lang="ZH-CN">部分定义了两个数据域</font><fontface="Arial">HResInfo</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">HGlobol</font><fontface="宋体" lang="ZH-CN">和一个私有方法</font><font face="Arial">Initialize</font><fontface="宋体" 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><fontface="Arial">Windows</font><font face="宋体" lang="ZH-CN">资源信息的结构句柄。</font><fontface="Arial">HGlobal</font><font face="宋体" lang="ZH-CN">变量代表资源所在模块的句柄。如果操作的是应用程序资源,</font><fontface="Arial">HGlohal</font><font face="宋体" lang="ZH-CN">就代表</font><fontface="Arial">EXE</font><font face="宋体" lang="ZH-CN">程序的句柄;如果是动态链接库(</font><fontface="Arial">DLL</font><font face="宋体" lang="ZH-CN">),则</font><font face="Arial">HGlobal</font><font face="宋体" lang="ZH-CN">代表动态链接库的句柄。</font><fontface="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">对象使用这两上变量访问应用程序或动态链接库中的资源。</p><p>  </font><font face="Arial">Initialize</font><font face="宋体" lang="ZH-CN">方法是</font><fontface="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">对象内部使用的。它的构造方法</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">CreateFromID</font><fontface="宋体" lang="ZH-CN">都是调用</font><font face="Arial">Initialize</font><fontface="宋体" lang="ZH-CN">方法完成对</font><font face="Arial">TResourceStream</font><fontface="宋体" 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><fontface="Arial">Windows</font><font face="宋体" lang="ZH-CN">函数</font><fontface="Arial">FoundResource</font><font face="宋体" lang="ZH-CN">得到由参数</font><fontface="Arial">Instance</font><font face="宋体" lang="ZH-CN">指定的模块中的名为</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">和类型为</font><fontface="Arial">ResType</font><font face="宋体" lang="ZH-CN">的资源,然后调用</font><fontface="Arial">LoadResource</font><font face="宋体" lang="ZH-CN">将资源调用内存,并返回该资源在内存中的句柄,最后,将该资源复制到</font><fontface="Arial">ResourceStream</font><font face="宋体" lang="ZH-CN">中。方法的</font><fontface="Arial">Instance</font><font face="宋体" lang="ZH-CN">参数代表要调用的资源所在的模块句柄。模块可以是可执行文件,也可以是动态链接库。如果在读取资源时没在模块中发现要找的资源则产生异常事件。</p><p>  </font><font face="Arial">2. </font><font face="宋体" lang="ZH-CN">构造方法</font><fontface="Arial">Create</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">CreateFromID</font><fontface="宋体" lang="ZH-CN"></p><p>  这两个方法在实现上没有大的不同。顾名思义,第一个方法是通过资源名构造</font><fontface="Arial">TResourceStream; </font><font face="宋体" lang="ZH-CN">第二个方法通过资源</font><fontface="Arial">ID</font><font face="宋体" lang="ZH-CN">构造</font><font face="Arial">TResourceStream</font><fontface="宋体" lang="ZH-CN">,而且在实现过程中,它们都调用了</font><fontface="Arial">Initialize</font><font face="宋体" lang="ZH-CN">方法。下面是它们的实现:</p><p> </p><p></font><font face="Arial">constructor TResourceStream.Create(Instance: THandle; constResName: 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><fontface="宋体" lang="ZH-CN">参数,该参数值的含义在</font><font face="Arial">Insitialize</font><fontface="宋体" 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><fontface="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><fontface="宋体" lang="ZH-CN">对象是不允许写数据的。一旦往资源流中写数据将产生异常事件。</p><p>  </font><font face="Arial">4. </font><font face="宋体" lang="ZH-CN">析构方法</font><fontface="Arial">Destroy</font><font face="宋体" lang="ZH-CN"></p><p>  该方法产生给资源解锁,然后释放该资源,最后调用继承的</font><fontface="Arial">Destroy</font><font face="宋体" lang="ZH-CN">方法释放</font><fontface="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><fontface="Arial">HGlobal</font><font face="宋体" lang="ZH-CN">句柄所指</font><fontface="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><fontface="宋体" lang="ZH-CN">状态,因此要根据</font><font face="Arial">Windows </font><fontface="宋体" lang="ZH-CN">的内存使用规则合理安排</font><font face="Arial">ResourceStream</font><fontface="宋体" 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><fontface="宋体" lang="ZH-CN">在单元中提供了</font><font face="Arial">InternalReadComponentRes</font><fontface="宋体" lang="ZH-CN">函数,该函数使用了</font><font face="Arial">TResourceStream</font><fontface="宋体" lang="ZH-CN">对象从</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">应用程序中读取部件。</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">是将窗体和部件信息放在模块资源的</font><fontface="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><fontface="Arial">TBlobStream </font><font face="宋体" lang="ZH-CN">对象是个很重要的对象。</font><fontface="Arial">TBlobStream</font><font face="宋体" lang="ZH-CN">对象提供了修改</font><fontface="Arial">TBlobField</font><font face="宋体" lang="ZH-CN">、</font><fontface="Arial">TBytesField</font><font face="宋体" lang="ZH-CN">或</font><fontface="Arial">TVarBytesField</font><font face="宋体" lang="ZH-CN">中数据的技术。开发者可以象对待文件或流那样在数据库域中读写数据。</p><p>  传统数据库发展的一个重要趋向是往多媒体数据库发展。目前比较著名和流行的数据库都支持多媒体功能,多媒体数据存储中的一大难点是数据结构不规则,数据量大。各大数据库产品是采用</font><font

⌨️ 快捷键说明

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