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

📄 055.htm

📁 很不错的delphi入门级教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<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="index.html"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR><A HREF="054.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.3.1.1</font><font face="宋体" lang="ZH-CN">写</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件的过程:</font><fontface="Arial">WriteComponentResFie</p><p> </font><font face="宋体" lang="ZH-CN">  该过程带有两个参数</font><fontface="Arial">FileName</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">。</font><font face="Arial">FileName</font><font face="宋体"lang="ZH-CN">参数指定要写入的</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件名,</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">参数是</font><font face="Arial">TComponent</font><fontface="宋体" lang="ZH-CN">类型的,它指定要写入的部件名,一般是</font><fontface="Arial">TForm</font><font face="宋体" lang="ZH-CN">对象的子类。该过程将</font><fontface="Arial">Instance</font><font face="宋体" lang="ZH-CN">部件和其拥有的所有部件写入</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件。</p><p>  这个过程的意义在于,可以在程序运行过程中产生</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的窗体部件和在窗体中插入部件,并由该函数将窗体写入</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件,支持了动态</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件的重用性。</p><p>  该过程的程序是这样的:</p><p> </p><p></font><font face="Arial">procedure WriteComponentResFile(const FileName: string;Instance: TComponent);</p><p>var</p><p>Stream: TStream;</p><p>begin</p><p>Stream := TFileStream.Create(FileName, fmCreate);</p><p>try</p><p>Stream.WriteComponentRes(Instance.ClassName, Instance);</p><p>finally</p><p>Stream.Free;</p><p>end;</p><p>end;</p><p> </font><font face="宋体" lang="ZH-CN"></p><p>  函数中,用</font><font face="Arial">FileStream</font><font face="宋体"lang="ZH-CN">创建文件,用</font><font face="Arial">Stream</font><font face="宋体"lang="ZH-CN">对象的</font><font face="Arial">WriteComponetRes</font><font face="宋体"lang="ZH-CN">方法将</font><font face="Arial">Instance</font><font face="宋体"lang="ZH-CN">写入流中。</p><p> </font><font face="Arial"></p><p>20.3.1.2 </font><font face="宋体" lang="ZH-CN">读</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件的函数:</font><font face="Arial">ReadComponentResFile</p><p> </p><p>ReadComponentResFile</font><font face="宋体" lang="ZH-CN">函数带有两个参数</font><fontface="Arial">FileName</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">。</font><font face="Arial">FileName</font><font face="宋体"lang="ZH-CN">参数指定要读</font><font face="Arial">DFM</font><font face="宋体"lang="ZH-CN">文件名,</font><font face="Arial">Instance</font><font face="宋体"lang="ZH-CN">参数指定从</font><font face="Arial">DFM</font><font face="宋体"lang="ZH-CN">文件中要读的部件。该函数从</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件中将</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">和它拥有的所有部件,并返回该部件。</p><p>  这个函数的意义在于,配合</font><font face="Arial">WriteComponentResFile</font><fontface="宋体" lang="ZH-CN">过程的使用支持</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件的重用性。</p><p>  该函数的程序是这样的:</p><p> </p><p></font><font face="Arial">function ReadComponentResFile(const FileName: string;Instance: TComponent): </p><p>TComponent;</p><p>var</p><p>Stream: TStream;</p><p>begin</p><p>Stream := TFileStream.Create(FileName, fmOpenRead);</p><p>try</p><p>Result := Stream.ReadComponentRes(Instance);</p><p>finally</p><p>Stream.Free;</p><p>end;</p><p>end;</p><p> </font><font face="宋体" lang="ZH-CN"></p><p>  程序中使用</font><font face="Arial">FileStream</font><font face="宋体"lang="ZH-CN">对象打开由</font><font face="Arial">FileName</font><font face="宋体"lang="ZH-CN">指定的</font><font face="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件,然后用</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象的</font><fontface="Arial">ReadComponentRes</font><font face="宋体" lang="ZH-CN">方法读出</font><fontface="Arial">Instance</font><font face="宋体" lang="ZH-CN">,并将读的结果作为函数的返回值。</p><p> </font><font face="Arial"></p><p>20.3.1.3 </font><font face="宋体" lang="ZH-CN">读取</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">应用程序资源中的部件</p><p> </p><p>  函数</font><font face="Arial">InternalReadComponentRes</font><fontface="宋体" lang="ZH-CN">可以读取</font><font face="Arial">Delphi</font><fontface="宋体" lang="ZH-CN">应用程序资源中的部件。</font><font face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">DFM</font><fontface="宋体" lang="ZH-CN">文件在程序经过编译链接后被嵌入应用程序的资源中,而且格式发生了改变,即少了资源文件头。</font><fontface="Arial"></p><p></font><font face="宋体" lang="ZH-CN">在第一节中曾经介绍过</font><fontface="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">对象,该对象是操作资源媒介上的数据的。函数</font><fontface="Arial">InternalReadComponentRes</font><font face="宋体" lang="ZH-CN">用了</font><fontface="Arial">TResourceStream</font><font face="宋体" lang="ZH-CN">。程序是这样的:</p><p> </p><p></font><font face="Arial">function InternalReadComponentRes(const ResName: string;</p><p>var Instance: TComponent): Boolean;</p><p>var</p><p>HRsrc: THandle;</p><p>begin { </font><font face="宋体" lang="ZH-CN">避免“</font><font face="Arial">EResNotFound</font><fontface="宋体" lang="ZH-CN">”异常事件的出现</font><font face="Arial"> }</p><p>HRsrc := FindResource(HInstance, PChar(ResName), RT_RCDATA);</p><p>Result := HRsrc &lt;&gt; 0;</p><p>if not Result then Exit;</p><p>FreeResource(HRsrc);</p><p>with TResourceStream.Create(HInstance, ResName, RT_RCDATA) do</p><p>try</p><p>Instance := ReadComponent(Instance);</p><p>finally</p><p>Free;</p><p>end;</p><p>Result := True;</p><p>end;</p><p> </font><font face="宋体" lang="ZH-CN"></p><p>  </font><font face="Arial">HInstance</font><font face="宋体" lang="ZH-CN">是一个</font><fontface="Arial">Delphi VCL</font><font face="宋体" lang="ZH-CN">定义的全局变量,代表当前应用程序的句柄。函数用了资源访问</font><fontface="Arial">API</font><font face="宋体" lang="ZH-CN">函数</font><font face="Arial">FindResource</font><fontface="宋体" lang="ZH-CN">来测定是否存在</font><font face="Arial">ResName</font><fontface="宋体" lang="ZH-CN">所描述资源。因为在</font><font face="Arial">TResourceStream</font><fontface="宋体" lang="ZH-CN">的创建过程还有</font><font face="Arial">FindResource</font><fontface="宋体" lang="ZH-CN">等操作,所以函数中调用了</font><font face="Arial">FreeResource</font><fontface="宋体" lang="ZH-CN">。最后函数调用了</font><font face="Arial">Stream</font><fontface="宋体" lang="ZH-CN">对象的</font><font face="Arial">ReadComponent</font><fontface="宋体" lang="ZH-CN">方法读出部件。因为函数的</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">是</font><font face="Arial">var</font><font face="宋体"lang="ZH-CN">类型的参数,所以可以访问</font><font face="Arial">Instance</font><fontface="宋体" lang="ZH-CN">,得到读出的部件。</p><p> </font><font face="Arial"></p><p>20.3.1.4 DFM</font><font face="宋体" lang="ZH-CN">文件与标准文本文件</font><fontface="Arial">(TXT</font><font face="宋体" lang="ZH-CN">文件</font><font face="Arial">)</font><fontface="宋体" lang="ZH-CN">的相互转换</p><p> </p><p>  在</font><font face="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计环境中,允许程序员在代码编辑器中以文本的方式浏览和修改</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件内容。当用</font><fontface="Arial">File/Open</font><font face="宋体" lang="ZH-CN">命令直接打开</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件或者选择窗体设计窗口的弹出式菜单上的</font><fontface="Arial">View as Text</font><font face="宋体" lang="ZH-CN">命令时,就会在编辑器中出现文本形式的信息。我们姑且将这种文本形式称之为窗体设计脚本。</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">提供的这种脚本编辑功能是对</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">可视化设计的一大补充。当然这个脚本编辑能力是有限制的,比方说不能在脚本任意地添加和删除部件,因为代码和</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">脚本是紧密相连的,任意添加和修改会导致不一致性。然而在动态生成的</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件中,就不存在这一限制,后面会介绍</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">动态生成技术的应用。</p><p>  实际上,</font><font face="Arial">DFM</font><font face="宋体" lang="ZH-CN">文件内容是二进制数据,它的脚本是经过</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">开发环境自动转化的,而且</font><fontface="Arial">Delphi VCL</font><font face="宋体" lang="ZH-CN">中的</font><fontface="Arial">Classes</font><font face="宋体" lang="ZH-CN">库单元中提供了在二进制流中的文件</font><fontface="Arial">DFM</font><font face="宋体" lang="ZH-CN">和它的脚本之相互转化的过程。它们是</font><fontface="Arial">ObjectBinaryToText</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">ObjectTextBinary</font><font face="宋体" lang="ZH-CN">、</font><fontface="Arial">ObjectResourceToText</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">ObjectTextToResource</font><font face="宋体" lang="ZH-CN">。</font><fontface="Arial"></p><p>ObjectBinaryToText</font><font face="宋体" lang="ZH-CN">过程将二进制流中存储的部件转化为基于文本的表现形式,这样就可以用文本处理函数进行处理,还可以用文本编辑器进行查找和替代操作,最后可以将文本再转化成二进制流中的部件。</p><p>  </font><font face="Arial">ObjectBinaryToText</font><font face="宋体"lang="ZH-CN">过程的主程序是这样的:</p><p> </p><p></font><font face="Arial">procedure ObjectBinaryToText(Input, Output: TStream);</p><p>var</p><p>NestingLevel: Integer;</p><p>SaveSeparator: Char;</p><p>Reader: TReader;</p><p>Writer: TWriter;</p><p> </p><p>procedure WriteIndent;</p><p>const</p><p>Blanks: array[0..1] of Char = ' ';</p><p>var</p><p>I: Integer;</p><p>begin</p><p>for I := 1 to NestingLevel do Writer.Write(Blanks, SizeOf(Blanks));</p><p>end;</p><p> </p><p>procedure WriteStr(const S: string);</p><p>begin</p><p>Writer.Write(S[1], Length(S));</p><p>end;</p><p> </p><p>procedure NewLine;</p><p>begin</p><p>WriteStr(#13#10);</p><p>WriteIndent;</p><p>end;</p><p> </p><p>procedure ConvertHeader;</p><p>begin</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">end;</p><p> </p><p>procedure ConvertBinary;</p><p>begin</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">end;</p><p> </p><p>procedure ConvertValue;</p><p>begin</font><font face="宋体" lang="ZH-CN"></p><p>…</p><p></font><font face="Arial">end;</p><p> </p><p>procedure ConvertProperty;</p><p>begin</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">end;</p><p> </p>

⌨️ 快捷键说明

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