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

📄 054.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
face="宋体" lang="ZH-CN">对象多了一个</font><font face="Arial">FButPos</font><font
face="宋体" lang="ZH-CN">的编移量。</p>
<p>  </font><font face="Arial">2. Defineproperty</font><font face="宋体"
lang="ZH-CN">和</font><font face="Arial">DefineBinaryproperty</font><font face="宋体"
lang="ZH-CN">方法的实现</font><font face="Arial"></p>
<p></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">和</font><font face="Arial">TWriter</font><font
face="宋体" lang="ZH-CN">对象中才有具体的实现。</p>
<p>  它们在</font><font face="Arial">TReader</font><font face="宋体" lang="ZH-CN">中的实现如下:</p>
<p>  </p>
<p></font><font face="Arial">procedure TReader.DefineProperty(const Name: string;
ReadData: TReaderProc; </p>
<p>WriteData: TWriterProc; HasData: Boolean);</p>
<p>begin</p>
<p>if CompareText(Name, FPropName) = 0 then</p>
<p>begin</p>
<p>ReadData(Self);</p>
<p>FPropName := '';</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>procedure TReader.DefineBinaryProperty(const Name: string;</p>
<p>ReadData, WriteData: TStreamProc; HasData: Boolean);</p>
<p>var</p>
<p>Stream: TMemoryStream;</p>
<p>Count: Longint;</p>
<p>begin</p>
<p>if CompareText(Name, FPropName) = 0 then</p>
<p>begin</p>
<p>if ReadValue &lt;&gt; vaBinary 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">Dec(FBufPos);</p>
<p>SkipValue;</p>
<p>FCanHandleExcepts := True;</p>
<p>PropValueError;</p>
<p>end;</p>
<p>Stream := TMemoryStream.Create;</p>
<p>try</p>
<p>Read(Count, SizeOf(Count));</p>
<p>Stream.SetSize(Count);</p>
<p>Read(Stream.Memory^, Count);</p>
<p>FCanHandleExcepts := True;</p>
<p>ReadData(Stream);</p>
<p>finally</p>
<p>Stream.Free;</p>
<p>end;</p>
<p>FPropName := '';</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">在两个方法都将</font><font face="Arial">Name</font><font
face="宋体" lang="ZH-CN">参数值与当前的属性名比较,如果相同则进行读操作。在</font><font
face="Arial">DefineBinaryproperty</font><font face="宋体" lang="ZH-CN">中,创建了一个内存流。先将数据读到内存流中然后调用</font><font
face="Arial">ReadData</font><font face="宋体" lang="ZH-CN">读取数据。</p>
<p>  </font><font face="Arial">3. FlushBuffer</font><font face="宋体" lang="ZH-CN">的实现</p>
<p>  </font><font face="Arial">FlushBuffer</font><font face="宋体" lang="ZH-CN">方法用于清除</font><font
face="Arial">Reader</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">)上的同步,其实现如下:</p>
<p> </p>
<p></font><font face="Arial">procedure TReader.FlushBuffer;</p>
<p>begin</p>
<p>FStream.Position := FStream.Position - (FBufEnd - FBufPos);</p>
<p>FBufPos := 0;</p>
<p>FBufEnd := 0;</p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  </font><font face="Arial">4. 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">方法</p>
<p>  这三个方法都是用于从</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">WriteListEnd</font><font face="宋体" lang="ZH-CN">写入标志,标定结束,在读循环中用</font><font
face="Arial">EndOfList</font><font face="宋体" lang="ZH-CN">进行判断。它们是在</font><font
face="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象读取流中数据时经常用于的。它们的实现如下:</p>
<p> </p>
<p></font><font face="Arial">procedure TReader.ReadListBegin;</p>
<p>begin</p>
<p>CheckValue(vaList);</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>procedure TReader.ReadListEnd;</p>
<p>begin</p>
<p>CheckValue(vaNull);</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>function TReader.EndOfList: Boolean;</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">Result := ReadValue = vaNull;</p>
<p>Dec(FBufPos);</p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  项目表开始标志是</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">VaList</font><font face="宋体"
lang="ZH-CN">和</font><font face="Arial">VaNull</font><font face="宋体" lang="ZH-CN">都是枚举类型</font><font
face="Arial">TValueType</font><font face="宋体" lang="ZH-CN">定义的常量。</p>
<p>  它们实现中调用的</font><font face="Arial">CheckValue</font><font
face="宋体" lang="ZH-CN">是</font><font face="Arial">TReader</font><font face="宋体"
lang="ZH-CN">的私有方法,其实现如下:</p>
<p> </p>
<p></font><font face="Arial">procedure TReader.CheckValue(Value: TValueType);</p>
<p>begin</p>
<p>if ReadValue &lt;&gt; Value then</p>
<p>begin</p>
<p>Dec(FBufPos);</p>
<p>SkipValue;</p>
<p>PropValueError;</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  </font><font face="Arial">CheckValue</font><font face="宋体" lang="ZH-CN">方法的功能是检测紧接着要读的值是否是</font><font
face="Arial">Value</font><font face="宋体" lang="ZH-CN">指定的类型。如果不是则跳过该项目并触发一个</font><font
face="Arial">SInvalidPropertyValue</font><font face="宋体" lang="ZH-CN">错误。</p>
<p>  </font><font face="Arial">EndOfList</font><font face="宋体" lang="ZH-CN">函数只是简单地判断下一字节是否是</font><font
face="Arial">VaNull</font><font face="宋体" lang="ZH-CN">将判断结果返回,并将字节移回原来位置。</p>
<p>  </font><font face="Arial">5. </font><font face="宋体" lang="ZH-CN">简单数据类型读方法的实现</p>
<p>  简单数据类型指的是布尔型、字符型、整型、字符串型、浮点型、集合类型和标识符。将它们放在一起介绍是因为它们的实现方法类似。</p>
<p>  因为它们的实现都用到了</font><font face="Arial">ReadValue</font><font
face="宋体" lang="ZH-CN">方法,因此先来介绍</font><font face="Arial">ReadValue</font><font
face="宋体" lang="ZH-CN">方法的实现:</p>
<p> </p>
<p></font><font face="Arial">function TReader.ReadValue: TValueType;</p>
<p>begin</p>
<p>Read(Result, SizeOf(Result));</p>
<p>end; </p>
<p></font> <font face="宋体" lang="ZH-CN"></p>
<p>  该方法调用私有方法</font><font face="Arial">Read</font><font
face="宋体" lang="ZH-CN">,从</font><font face="Arial">Reader</font><font
face="宋体" lang="ZH-CN">对象流中读一个字节,并移动位置指针。</p>
<p>  </font><font face="Arial">ReadValue</font><font face="宋体" lang="ZH-CN">方法专门从流中读取值的类型的,所有的数据读写方法中在读取数据前都要调用</font><font
face="Arial">ReadValue</font><font face="宋体" lang="ZH-CN">方法判断是否是所要读的数据。如果是,则调用</font><font
face="Arial">Read</font><font face="宋体" lang="ZH-CN">方法读取数据;否则触发一个异常事件,下面看</font><font
face="Arial">Integer</font><font face="宋体" lang="ZH-CN">类型的读方法:</p>
<p> </p>
<p></font><font face="Arial">function TReader.ReadInteger: Longint;</p>
<p>var</p>
<p>S: Shortint;</p>
<p>I: Smallint;</p>
<p>begin</p>
<p>case ReadValue of</p>
<p>vaInt8:</p>
<p>begin</p>
<p>Read(S, SizeOf(Shortint));</p>
<p>Result := S;</p>
<p>end;</p>
<p>vaInt16:</p>
<p>begin</p>
<p>Read(I, SizeOf(I));</p>
<p>Result := I;</p>
<p>end;</p>
<p>vaInt32:</p>
<p>Read(Result, SizeOf(Result));</p>
<p>else</p>
<p>PropValueError;</p>
<p>end;</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p></font><font face="宋体" lang="ZH-CN">因为</font><font face="Arial">Delphi 2.0</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">位,因此读取整型数据时分别作了判断。</p>
<p>  布尔类型的数据是直接放在值类型标志上,如果类型为</font><font
face="Arial">VaTrue</font><font face="宋体" lang="ZH-CN">,则值为</font><font
face="Arial">True</font><font face="宋体" lang="ZH-CN">;如果类型为</font><font
face="Arial">VaFalse</font><font face="宋体" lang="ZH-CN">,则值为</font><font
face="Arial">False</font><font face="宋体" lang="ZH-CN">。</p>
<p> </p>
<p></font><font face="Arial">function TReader.ReadBoolean: Boolean;</p>
<p>begin</p>
<p>Result := ReadValue = vaTrue;</p>
<p>end;</p>
<p></font> <font face="Arial"></p>
<p>ReadString</font><font face="宋体" lang="ZH-CN">方法也利用</font><font
face="Arial">ReadValue</font><font face="宋体" lang="ZH-CN">方法判断是字符串还是长字符串。</p>
<p> </p>
<p></font><font face="Arial">function TReader.ReadString: string;</p>
<p>var</p>
<p>L: Integer;</p>
<p>begin</p>
<p>L := 0;</p>
<p>case ReadValue of</p>
<p>vaString:</p>
<p>Read(L, SizeOf(Byte));</p>
<p>vaLString:</p>
<p>Read(L, SizeOf(Integer));</p>
<p>else</p>
<p>PropValueError;</p>
<p>end;</p>

⌨️ 快捷键说明

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