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

📄 053.htm

📁 Delphi基础知识讲座
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<p> </font><font face="Arial"></p>
<p>20.2.2.2 TWriter</font><font face="宋体" lang="ZH-CN">对象的实现</p>
<p> </p>
<p>  </font><font face="Arial">TWriter</font><font face="宋体" lang="ZH-CN">对象提供了许多往流中写各种类型数据的方法,这对于程序员来说是很重要的功能。</font><font
face="Arial">TWrite</font><font face="宋体" lang="ZH-CN">对象往流中写数据是依据不同的数据采取不同的格式的。</font>
<font face="宋体" lang="ZH-CN">因此要掌握</font><font face="Arial">TWriter</font><font
face="宋体" lang="ZH-CN">对象的实现和应用方法,必须了解</font><font
face="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象存储数据的格式。</p>
<p>  首先要说明的是,每个</font><font face="Arial">Filer</font><font
face="宋体" lang="ZH-CN">对象的流中都包含有</font><font face="Arial">Filer</font><font
face="宋体" lang="ZH-CN">对象标签。该标签占四个字节其值为“</font><font
face="Arial">TPF0</font><font face="宋体" lang="ZH-CN">”。</font><font face="Arial">Filer</font><font
face="宋体" lang="ZH-CN">对象为</font><font face="Arial">WriteSignature</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">(</font><font face="宋体" lang="ZH-CN">部件等</font><font face="Arial">)</font><font
face="宋体" lang="ZH-CN">时,指导读操作。</p>
<p>  其次,</font><font face="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象在存储数据前都要留一个字节的标志位,以指出后面存放的是什么类型的数据。该字节为</font><font
face="Arial">TValueType</font><font face="宋体" lang="ZH-CN">类型的值。</font><font
face="Arial">TValueType</font><font face="宋体" lang="ZH-CN">是枚举类型,占一个字节空间,其定义如下:</p>
<p> </p>
<p>  </font><font face="Arial">TValueType = (VaNull, VaList, VaInt8, VaInt16, VaInt32,
VaEntended, VaString, VaIdent, </p>
<p>VaFalse, VaTrue, VaBinary, VaSet, VaLString, VaNil, VaCollection); </p>
<p></font> <font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">因此,对</font><font face="Arial">Writer</font><font
face="宋体" lang="ZH-CN">对象的每一个写数据方法,在实现上,都要先写标志位再写相应的数据</font><font
face="Arial">;</font><font face="宋体" lang="ZH-CN">而</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">对象的每一个读数据方法都要先读标志位进行判断,如果符合就读数据,否则产生一个读数据无效的异常事件。</font><font
face="Arial">VaList</font><font face="宋体" lang="ZH-CN">标志有着特殊的用途,它是用来标识后面将有一连串类型相同的项目,而标识连续项目结束的标志是</font><font
face="Arial">VaNull</font><font face="宋体" lang="ZH-CN">。因此,在</font><font
face="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象写连续若干个相同项目时,先用</font><font
face="Arial">WriteListBegin</font><font face="宋体" lang="ZH-CN">写入</font><font
face="Arial">VaList</font><font face="宋体" lang="ZH-CN">标志,写完数据项目后,再写出</font><font
face="Arial">VaNull</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">EndofList</font><font face="宋体" lang="ZH-CN">函数判断是否有</font><font
face="Arial">VaNull</font><font face="宋体" lang="ZH-CN">标志。</p>
<p>  下面就介绍它们的实现。</p>
<p>  </font><font face="Arial">1. TWriter</font><font face="宋体" lang="ZH-CN">对象属性的实现</p>
<p>  </font><font face="Arial">TWriter</font><font face="宋体" lang="ZH-CN">对象直接从</font><font
face="Arial">TFiler</font><font face="宋体" lang="ZH-CN">对象继承,它只增加了</font><font
face="Arial">Position</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">RootAncestor</font><font
face="宋体" lang="ZH-CN">属性。</font><font face="Arial"></p>
<p>RootAncestor</font><font face="宋体" lang="ZH-CN">属性在</font><font face="Arial">private</font><font
face="宋体" lang="ZH-CN">部分有数据域</font><font face="Arial">FRootAncestor</font><font
face="宋体" lang="ZH-CN">存入其值。在属性定义的读与控制上都是直接读取该值。</p>
<p>  </font><font face="Arial">Position</font><font face="宋体" lang="ZH-CN">属性的定义中包含了两个读写控制方法:</font><font
face="Arial">GetPosition</font><font face="宋体" lang="ZH-CN">和</font><font
face="Arial">SetPosition</font><font face="宋体" lang="ZH-CN">:</p>
<p> </p>
<p></font><font face="Arial">TWriter = class(TFiler)</p>
<p>private</p>
<p>FRootAncestor: TComponent;</p>
<p></font><font face="宋体" lang="ZH-CN">…</p>
<p></font><font face="Arial">function GetPosition: Longint;</p>
<p>procedure SetPosition(Value: Longint);</p>
<p>public</p>
<p></font><font face="宋体" lang="ZH-CN">…</p>
<p></font><font face="Arial">property Position: Longint read GetPosition write
SetPosition;</p>
<p>property RootAncestor: TComponent read FRootAncestor write FRootAncestor;</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>GetPosition</font><font face="宋体" lang="ZH-CN">和</font><font face="Arial">SetPosition</font><font
face="宋体" lang="ZH-CN">方法实现如下:</p>
<p> </p>
<p></font><font face="Arial">function TWriter.GetPosition: Longint;</p>
<p>begin</p>
<p>Result := FStream.Position + FBufPos;</p>
<p>end;</font><font face="宋体" lang="ZH-CN"></p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.SetPosition(Value: Longint);</p>
<p>var</p>
<p>StreamPosition: Longint;</p>
<p>begin</p>
<p>StreamPosition := FStream.Position;</p>
<p>{ </font><font face="宋体" lang="ZH-CN">只清除越界的缓冲区</font> <font
face="Arial">}</p>
<p>if (Value &lt; StreamPosition) or (Value &gt; StreamPosition + FBufPos) then</p>
<p>begin</p>
<p>WriteBuffer;</p>
<p>FStream.Position := Value;</p>
<p>end</p>
<p>else FBufPos := Value - StreamPosition;</p>
<p>end; </p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  </font><font face="Arial">WriteBuffer</font><font face="宋体" lang="ZH-CN">是</font><font
face="Arial">TWriter</font><font face="宋体" lang="ZH-CN">对象定义的私有方法,它的作用是将</font><font
face="Arial">Writer </font><font face="宋体" lang="ZH-CN">对象内部缓冲区中的有效数据写入流中,并将</font><font
face="Arial">FBufPos</font><font face="宋体" lang="ZH-CN">置为</font><font
face="Arial">0</font><font face="宋体" lang="ZH-CN">。</font><font face="Arial">Writer</font><font
face="宋体" lang="ZH-CN">对象的</font><font face="Arial">FlushBuffer</font><font
face="宋体" lang="ZH-CN">对象就是用</font><font face="Arial">WriteBuffer</font><font
face="宋体" lang="ZH-CN">方法刷新缓冲区。</p>
<p>  在</font><font face="Arial">SetPosition</font><font face="宋体" lang="ZH-CN">方法中,如果</font><font
face="Arial">Value</font><font face="宋体" lang="ZH-CN">值超出了边界</font><font
face="Arial">(FStream.Position</font><font face="宋体" lang="ZH-CN">,</font><font
face="Arial">FStream.Position + FBufPos)</font><font face="宋体" lang="ZH-CN">,就将缓冲区中的内容写入流,重新设置缓冲区在流中的相对位置;否则,就只是移动</font><font
face="Arial">FBufPos</font><font face="宋体" lang="ZH-CN">指针。</p>
<p>  </font><font face="Arial">2. TWriter</font><font face="宋体" lang="ZH-CN">方法的实现</p>
<p>  ⑴</font><font face="Arial"> WriteListBegin</font><font face="宋体"
lang="ZH-CN">和</font><font face="Arial">WriteListEnd</font><font face="宋体"
lang="ZH-CN">的实现</p>
<p>  这两个方法都是用于写连续若干个相同类型的值。</font><font
face="Arial">WriteListBegin</font><font face="宋体" lang="ZH-CN">写入</font><font
face="Arial">VaList</font><font face="宋体" lang="ZH-CN">标志,</font><font
face="Arial">WriteListEnd</font><font face="宋体" lang="ZH-CN">写入</font><font
face="Arial">VaNull</font><font face="宋体" lang="ZH-CN">标志。</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteListBegin;</p>
<p>begin</p>
<p>WriteValue(vaList);</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>procedure TWriter.WriteListEnd;</p>
<p>begin</p>
<p>WriteValue(vaNull);</p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  这两个方法都调用</font><font face="Arial">TWriter</font><font
face="宋体" lang="ZH-CN">对象的</font><font face="Arial">WriteValue</font><font
face="宋体" lang="ZH-CN">方法,该方法主要用于写入</font><font face="Arial">TValueType</font><font
face="宋体" lang="ZH-CN">类型的值。</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteValue(Value: TValueType);</p>
<p>begin</p>
<p>Write(Value, SizeOf(Value)); </p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  ⑵</font><font face="Arial"> </font><font face="宋体" lang="ZH-CN">简单数据类型的写入</p>
<p>  简单数据类型指的是整型、字符型、字符串型、浮点型、布尔型等。</font><font
face="Arial">TWriter</font><font face="宋体" lang="ZH-CN">对象都定义了相应的写入方法。</p>
<p>  </font><font face="Arial">WriteInteger</font><font face="宋体" lang="ZH-CN">方法用于写入整型数据。</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteInteger(Value: Longint);</p>
<p>begin</p>
<p>if (Value &gt;= -128) and (Value &lt;= 127) then</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">WriteValue(vaInt8);</p>
<p>Write(Value, SizeOf(Shortint));</p>
<p>end else</p>
<p>if (Value &gt;= -32768) and (Value &lt;= 32767) then</p>
<p>begin</p>
<p>WriteValue(vaInt16);</p>
<p>Write(Value, SizeOf(Smallint));</p>
<p>end else</p>
<p>begin</p>
<p>WriteValue(vaInt32);</p>
<p>Write(Value, SizeOf(Longint));</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  </font><font face="Arial">WriteInteger</font><font face="宋体" lang="ZH-CN">方法将整型数据分为</font><font
face="Arial">8</font><font face="宋体" lang="ZH-CN">位、</font><font face="Arial">16</font><font
face="宋体" lang="ZH-CN">位和</font><font face="Arial">32</font><font face="宋体"
lang="ZH-CN">位三种,并分别用</font><font face="Arial">vaInt8</font><font
face="宋体" lang="ZH-CN">、</font><font face="Arial">vaInt16</font><font face="宋体"
lang="ZH-CN">和</font><font face="Arial">VaInt32</font><font face="宋体" lang="ZH-CN">。</p>
<p>  </font><font face="Arial">WriteBoolean</font><font face="宋体" lang="ZH-CN">用于写入布尔型数据:</p>
<p> </p>
<p></font><font face="Arial">procedure TWriter.WriteBoolean(Value: Boolean);</p>
<p>begin</p>
<p>if Value then</p>

⌨️ 快捷键说明

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