📄 054.htm
字号:
<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="055.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="053.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.2.3 TReader</font><font face="宋体" lang="ZH-CN">对象 </p>
<p> </font><font face="Arial">TReader</font><font face="宋体" lang="ZH-CN">对象是可实例化的用于从相联系的流中读取数据的</font><font
face="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象。</font><font
face="Arial">TReader</font><font face="宋体" lang="ZH-CN">对象从</font><font
face="Arial">TFiler</font><font face="宋体" lang="ZH-CN">继承下来,除了从</font><font
face="Arial">TFiler</font><font face="宋体" lang="ZH-CN">继承的属性和方法外,</font><font
face="Arial">TReader</font><font face="宋体" lang="ZH-CN">声明了不少属性、方法和事件。</p>
<p> </font> <font face="Arial">Owner</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">Parent</font><font face="宋体" lang="ZH-CN">属性用于表示从</font><font
face="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象的流中读取的部件的拥有者和双亲结点。</font><font
face="Arial">OnError</font><font face="宋体" lang="ZH-CN">,</font><font face="Arial">OnFindMethod</font><font
face="宋体" lang="ZH-CN">和</font><font face="Arial">OnSetName</font><font
face="宋体" lang="ZH-CN">事件使应用程序在运行中读数据时能定制响应方式。除了覆盖了一些从</font><font
face="Arial">TFiler</font><font face="宋体" lang="ZH-CN">对象中继承的方法外,</font><font
face="Arial">TReader</font><font face="宋体" lang="ZH-CN">对象还定义大量的读不同类型的数据和触发事件的方法。</p>
<p> </font><font face="Arial"></p>
<p>20.2.3.1 TReader</font><font face="宋体" lang="ZH-CN">对象的属性和方法</p>
<p> </p>
<p> </font><font face="Arial">1. Owner</font><font face="宋体" lang="ZH-CN">属性</p>
<p> 声明:</font><font face="Arial">property Owner: TComponent; </p>
<p>Reader</font><font face="宋体" lang="ZH-CN">对象的</font><font face="Arial">Owner</font><font
face="宋体" lang="ZH-CN">属性存储了将用来给从</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">的流中读出的部件的</font><font face="Arial">Owner</font><font
face="宋体" lang="ZH-CN">属性赋值的部件。</p>
<p> </font><font face="Arial">2. Parent</font><font face="宋体" lang="ZH-CN">属性</p>
<p> 声明:</font><font face="Arial">property Parent: TComponent; </p>
<p>Parent</font><font face="宋体" lang="ZH-CN">属性存储将用来给从</font><font
face="Arial">Reader</font><font face="宋体" lang="ZH-CN">的流中读出所有控制的</font><font
face="Arial">Parent</font><font face="宋体" lang="ZH-CN">属性赋值的部件。</p>
<p> </font><font face="Arial">3. Position</font><font face="宋体" lang="ZH-CN">属性</p>
<p> 声明:</font><font face="Arial">propertion: Longint; </p>
<p>Reader</font><font face="宋体" lang="ZH-CN">对象的</font><font face="Arial">Position</font><font
face="宋体" lang="ZH-CN">属性表示相联的流中读的当前位置。</font><font
face="Arial">Position</font><font face="宋体" lang="ZH-CN">的值还应包括读缓冲区的大小。对于</font><font
face="Arial">Reader </font><font face="宋体" lang="ZH-CN">对象,</font><font
face="Arial">Position</font><font face="宋体" lang="ZH-CN">的值大于流的</font><font
face="Arial">Position </font><font face="宋体" lang="ZH-CN">的值。如果将</font><font
face="Arial">Position</font><font face="宋体" lang="ZH-CN">的值设得超过当前缓冲区,将引起调用</font><font
face="Arial">FlushBuffer</font><font face="宋体" lang="ZH-CN">。</p>
<p> </font><font face="Arial">4. BeginReferences</font><font face="宋体"
lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure BeginReferences; </p>
<p>BeginReferences</font><font face="宋体" lang="ZH-CN">方法启动一连串关于读部件的命令,这些部件包含相互间的交叉引用。在使用上通常和</font><font
face="Arial">FixupReferences</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">EndReferences</font><font face="宋体" lang="ZH-CN">一起放在</font><font
face="Arial">Try</font><font face="宋体" lang="ZH-CN">…</font><font face="Arial">finally</font><font
face="宋体" lang="ZH-CN">程序块中。</p>
<p> 在调用了</font><font face="Arial">BeginReferences</font><font face="宋体"
lang="ZH-CN">后,</font><font face="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象创建读取所有对象和名字的列表。所有的独立对象被读出后,调用</font><font
face="Arial">FixupReferences</font><font face="宋体" lang="ZH-CN">方法将名字的相互从流中转移到对象实例中。最后调用</font><font
face="Arial">EndReferences</font><font face="宋体" lang="ZH-CN">方法释放列表。</p>
<p> 处理部件相互引用的程序块形式如下:</p>
<p> </p>
<p></font><font face="Arial">BeginReferences; { </font><font face="宋体" lang="ZH-CN">创建临时列表</font>
<font face="Arial">}</p>
<p>try</p>
<p>{ </font><font face="宋体" lang="ZH-CN">读出所有部件并将它们的名字放在一临时列表中</font>
<font face="Arial">}</p>
<p></font><font face="宋体" lang="ZH-CN">…</p>
<p></font><font face="Arial">FixupReferences; { </font><font face="宋体" lang="ZH-CN">分</font>
<font face="宋体" lang="ZH-CN">解</font> <font face="Arial">}</p>
<p>finally</p>
<p>EndReferences; { </font><font face="宋体" lang="ZH-CN">释放临时列表</font> <font
face="Arial">}</p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p> </font><font face="Arial">5. FixUpReferences</font><font face="宋体"
lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure FixupReferences; </p>
<p>FixupReferences</font><font face="宋体" lang="ZH-CN">方法分解从流中读出的存在各种相互依赖部件的引用关系。</font><font
face="Arial">FixupReferences</font><font face="宋体" lang="ZH-CN">总在</font><font
face="Arial">try</font><font face="宋体" lang="ZH-CN">…</font><font face="Arial">finally</font><font
face="宋体" lang="ZH-CN">块中并配合</font><font face="Arial">BeginReferences</font><font
face="宋体" lang="ZH-CN">和</font><font face="Arial">EndReferences</font><font
face="宋体" lang="ZH-CN">一起使用。</p>
<p> </font><font face="Arial">6. EndReferences</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure EndReferences; </p>
<p>EndReferences</font><font face="宋体" lang="ZH-CN">方法终止处理相互引用的块操作,释放对象列表。它总配合</font><font
face="Arial">BeginReferences</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">FixupReferences</font><font face="宋体" lang="ZH-CN">一起使用。</p>
<p> </font><font face="Arial">7. ReadListBegin</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure ReadListBegin; </p>
<p>ReadListBegin</font><font face="宋体" lang="ZH-CN">方法从</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">对象相联的流中读取列表开始标志。如果流中紧接着要读取的项目不是一个由</font><font
face="Arial">WritelistBegin</font><font face="宋体" lang="ZH-CN">方法写入的列表起始标志,</font><font
face="Arial">ReadListBegin</font><font face="宋体" lang="ZH-CN">将引起一个读异常事件。</p>
<p> 通常在调用</font><font face="Arial">ReadlistBegin</font><font face="宋体"
lang="ZH-CN">方法之后,紧跟着一个读项目的循环,循环以</font><font
face="Arial">EndfList</font><font face="宋体" lang="ZH-CN">方法返回</font><font
face="Arial">True </font><font face="宋体" lang="ZH-CN">终止条件。这时,预示流中的下一个项目是列表结束标志,需要调用</font><font
face="Arial">ReadListEnd</font><font face="宋体" lang="ZH-CN">方法。</p>
<p> </font><font face="Arial">8. ReadListEnd</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure ReadListEnd; </p>
<p>ReadListEnd </font><font face="宋体" lang="ZH-CN">方法从流中读取列表结束标志。如果所读的项目不是一个列表结束标志,</font><font
face="Arial">ReadListEnd</font><font face="宋体" lang="ZH-CN">方法引发一个</font><font
face="Arial">EReadError</font><font face="宋体" lang="ZH-CN">异常事件。</p>
<p> </font><font face="Arial">9. EndOfList</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">function EndOfList: Boolean; </p>
<p></font><font face="宋体" lang="ZH-CN">如果</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">对象读到项目列表结果标志,</font><font
face="Arial">EndOfList</font><font face="宋体" lang="ZH-CN">方法返回</font><font
face="Arial">True</font><font face="宋体" lang="ZH-CN">。</p>
<p> </font><font face="Arial">TStrings</font><font face="宋体" lang="ZH-CN">对象在从</font><font
face="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象读取项目列表时使用了</font><font
face="Arial">ReadListBegin</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">ReadListEnd</font><font face="宋体" lang="ZH-CN">方法。下面的</font><font
face="Arial">ReadData</font><font face="宋体" lang="ZH-CN">是</font><font face="Arial">TStrings</font><font
face="宋体" lang="ZH-CN">的方法,用于在</font><font face="Arial">DefineProperties</font><font
face="宋体" lang="ZH-CN">方面中读</font><font face="Arial">string</font><font
face="宋体" lang="ZH-CN">数据。</p>
<p> </p>
<p></font><font face="Arial">procedure TStrings.ReadData(Reader: TReader);</p>
<p>begin</p>
<p>Reader.ReadListBegin; { </font><font face="宋体" lang="ZH-CN">读列表开始标志</font>
<font face="Arial">}</p>
<p>Clear; { </font><font face="宋体" lang="ZH-CN">清除已有的字符串</font> <font
face="Arial">}</p>
<p>while not Reader.EndOfList do { </font><font face="宋体" lang="ZH-CN">只要还有数据</font>
<font face="宋体" lang="ZH-CN">…</font><font face="Arial"> }</p>
<p>Add(Reader.ReadString); { </font><font face="宋体" lang="ZH-CN">…读一个字符串并将其加在列表中</font>
<font face="Arial">}</font><font face="宋体" lang="ZH-CN"></p>
<p></font><font face="Arial">Reader.ReadListEnd; { </font><font face="宋体" lang="ZH-CN">越过列表结束标志</font>
<font face="Arial">}</font><font face="宋体" lang="ZH-CN"></p>
<p></font><font face="Arial">end;</p>
<p></font> <font face="Arial"></p>
<p>10. ReadSignature</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure ReadSignature; </p>
<p>ReadSignature</font><font face="宋体" lang="ZH-CN">方法从流中读取部件之前首先调用</font><font
face="Arial">ReadSignature</font><font face="宋体" lang="ZH-CN">方法。在载入对象之前检测标签。</font><font
face="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象就能防止疏忽大意,导致读取无效或过时的数据。</font><font
face="Arial">Filer</font><font face="宋体" lang="ZH-CN">标签是四个字符,对于</font><font
face="Arial">Delphi 2.0</font><font face="宋体" lang="ZH-CN">,该标签是“</font><font
face="Arial">TPF0</font><font face="宋体" lang="ZH-CN">”。</p>
<p> </font><font face="Arial">11. ReadPrefix</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">procedure ReadPrefix(var Plags: TFilerFlags;
var AChild, Pos: Integer); </p>
<p>ReadPrefix</font><font face="宋体" lang="ZH-CN">方法的功能与</font><font
face="Arial">ReadSignature</font><font face="宋体" lang="ZH-CN">的很相象,只不过它是读取流中部件前面的标志</font><font
face="Arial">(PreFix)</font><font face="宋体" lang="ZH-CN">。当一个</font><font
face="Arial">Write</font><font face="宋体" lang="ZH-CN">对象将部件写入流中时,它在部件前面预写了两个值,第一个值是指明部件是否是从祖先窗体中继承的窗体和它在窗体中的位置是否重要的标志</font><font
face="Arial">;</font><font face="宋体" lang="ZH-CN">第二个值指明它在祖先窗体创建次序。</font><font
face="Arial">ReadComponent</font><font face="宋体" lang="ZH-CN">方法自动调用</font><font
face="Arial">ReadPrefix</font><font face="宋体" lang="ZH-CN">。但如果需要独立读取部件的预读标志,也可直接调用该方向。</p>
<p> </font><font face="Arial">12. OnFindMethod</font><font face="宋体" lang="ZH-CN">事件</p>
<p> 声明:</font><font face="Arial">property OnFindMethod: TFindMethodEvent; </p>
<p>OnFindMethod</font><font face="宋体" lang="ZH-CN">事件,发生在</font><font
face="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象读取对象的方法指针时,属性为方法指针的通常都是事件。</p>
<p> 响应</font><font face="Arial">OnFindMethod</font><font face="宋体"
lang="ZH-CN">事件的理由,通常是处理过程找不到方法的情况。在</font><font
face="Arial">FindMethod</font><font face="宋体" lang="ZH-CN">方法没有找到由</font><font
face="Arial">Name</font><font face="宋体" lang="ZH-CN">指定的方法的情况下,如果它将</font><font
face="Arial">OnFindMethod</font><font face="宋体" lang="ZH-CN">方法的</font><font
face="Arial">Error </font><font face="宋体" lang="ZH-CN">参数设为</font><font
face="Arial">True</font><font face="宋体" lang="ZH-CN">,将引起</font><font
face="Arial">ReadError</font><font face="宋体" lang="ZH-CN">异常事件;反之,将</font><font
face="Arial">Error</font><font face="宋体" lang="ZH-CN">参数置为</font><font
face="Arial">False</font><font face="宋体" lang="ZH-CN">,将防止</font><font
face="Arial">FindMethod</font><font face="宋体" lang="ZH-CN">方法引发异常事件。</p>
<p> </font><font face="Arial">13. Error</font><font face="宋体" lang="ZH-CN">方法</p>
<p> 声明:</font><font face="Arial">function Error(const Message: String):
Boolean; virtual; </p>
<p>Error</font><font face="宋体" lang="ZH-CN">方法定义在</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">对象的</font><font face="Arial">protected</font><font
face="宋体" lang="ZH-CN">部分,它是用于</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">对象的</font><font face="Arial">OnError</font><font
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -