📄 054.htm
字号:
face="宋体" lang="ZH-CN">对象的</font><font face="Arial">OnError</font><fontface="宋体" lang="ZH-CN">事件。其返回值决定是否继续错误处理过程。如果返回值为</font><fontface="Arial">True</font><font face="宋体" lang="ZH-CN">,则表示用程序应当继续错误处理;如果返回值为</font><fontface="Arial">False</font><font face="宋体" lang="ZH-CN">,则表示错误情况被忽略。</p><p> 如果读部件或属性出错。</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象调用</font><font face="Arial">Error</font><fontface="宋体" lang="ZH-CN">方法。缺省情况下,</font><font face="Arial">Error</font><fontface="宋体" lang="ZH-CN">将返回值设为</font><font face="Arial">False</font><fontface="宋体" lang="ZH-CN">,然后调用</font><font face="Arial">OnError</font><fontface="宋体" lang="ZH-CN">事件处理过程。</p><p> </font><font face="Arial">TReader</font><font face="宋体" lang="ZH-CN">对象总是在</font><fontface="Arial">try</font><font face="宋体" lang="ZH-CN">…</font><font face="Arial">except</font><fontface="宋体" lang="ZH-CN">程序块的</font><font face="Arial">except</font><fontface="宋体" lang="ZH-CN">部分,并提供用户忽略错误的机会。</font><fontface="Arial">Error</font><font face="宋体" lang="ZH-CN">的使用方法如下:</p><p> </p><p> </font><font face="Arial">try</p><p></font><font face="宋体" lang="ZH-CN">…</font><font face="Arial"> { </font><fontface="宋体" lang="ZH-CN">读部件</font> <font face="Arial">}</p><p>except</p><p>on E: Exception do</p><p>begin</p><p></font><font face="宋体" lang="ZH-CN">…{</font><font face="Arial"> </font><fontface="宋体" lang="ZH-CN">执行一些清除操作</font> <font face="Arial">}</p><p>if Error(E.Message) then raise; </p><p>end; </p><p>end;</p><p></font> <font face="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">14. OnError</font><font face="宋体" lang="ZH-CN">事件</p><p> 声明:</font><font face="Arial">property OnError: TReaderError; </p><p></font><font face="宋体" lang="ZH-CN">当</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象读取数据出错时将引发</font><font face="Arial">OnError</font><fontface="宋体" lang="ZH-CN">事件。通过处理</font><font face="Arial">OnError</font><fontface="宋体" lang="ZH-CN">事件,可以有选择地处理或忽略错误。</p><p> 传给</font><font face="Arial">OnError</font><font face="宋体" lang="ZH-CN">事件处理过程的最后一个参数是名为</font><fontface="Arial">Handled</font><font face="宋体" lang="ZH-CN">的</font><font face="Arial">var</font><fontface="宋体" lang="ZH-CN">参数。在缺省情况下,</font><font face="Arial">Error</font><fontface="宋体" lang="ZH-CN">方法将</font><font face="Arial">Handled</font><fontface="宋体" lang="ZH-CN">置为</font><font face="Arial">True</font><font face="宋体"lang="ZH-CN">。这将阻止错误更进一步处理。如果事件处理过程仍旧将</font><fontface="Arial">Handled</font><font face="宋体" lang="ZH-CN">置为</font><fontface="Arial">False</font><font face="宋体" lang="ZH-CN">,</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象将引发一个</font><font face="Arial">EReadError</font><fontface="宋体" lang="ZH-CN">异常事件。</p><p> </font><font face="Arial"></p><p>15. SetName</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">procedure SetName(Component: TComponent; varName: String virtual); </p><p>SetName</font><font face="宋体" lang="ZH-CN">方法允许</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象在将从流中读取的部件的</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">值赋给部件的</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">属性前修改</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">值。</font><font face="Arial">ReadComponent</font><fontface="宋体" lang="ZH-CN">方法在读取部件的属性值和其它数据前先读部件的类型和名字在读完名字后,</font><fontface="Arial">ReadComponent</font><font face="宋体" lang="ZH-CN">将所读的名字作为</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">参数传给</font><fontface="Arial">SetName</font><font face="宋体" lang="ZH-CN">,</font><font face="Arial">Name</font><font face="宋体" lang="ZH-CN">是个</font><font face="Arial">var</font><fontface="宋体" lang="ZH-CN">参数,因此</font><font face="Arial">SetName</font><fontface="宋体" lang="ZH-CN">能在返回前修改字符串值。</font><font face="Arial">SetName</font><fontface="宋体" lang="ZH-CN">还调用了</font><font face="Arial">OnSetName</font><fontface="宋体" lang="ZH-CN">事件处理过程,将名字字符串作为</font><fontface="Arial">var</font><font face="宋体" lang="ZH-CN">参数传入事件处理过程中,因此,事件处理过程也可修改字符串的值。</p><p> </font><font face="Arial">16. OnSetName</font><font face="宋体" lang="ZH-CN">事件</p><p> 声明:</font><font face="Arial">property OnSetName: TSetNameEvent; </p><p>OnSetName</font><font face="宋体" lang="ZH-CN">事件发生在</font><fontface="Arial">Read</font><font face="宋体" lang="ZH-CN">对象设置部件的</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">属性前,</font><fontface="Arial">OnSetName</font><font face="宋体" lang="ZH-CN">事件处理过程的</font><fontface="Arial">var</font><font face="宋体" lang="ZH-CN">参数</font><font face="Arial">Name</font><fontface="宋体" lang="ZH-CN">参数是一个</font><font face="Arial">var</font><fontface="宋体" lang="ZH-CN">参数,因此,事件处理过程再将</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">赋给部件前,可以修改</font><fontface="Arial">Name</font><font face="宋体" lang="ZH-CN">的值。这对于想过滤窗体中部件的名字是很有帮助的。</p><p> 下面的</font><font face="Arial">OnSetName</font><font face="宋体"lang="ZH-CN">事件处理过程,命名了名字中包含“</font><font face="Arial">Button</font><fontface="宋体" lang="ZH-CN">”的部件,并用“</font><font face="Arial">PushButton</font><fontface="宋体" lang="ZH-CN">”替代。</p><p> </p><p></font><font face="Arial">procedure TForm1.ReaderSetName(Reader: TReader; Component:TComponent;</p><p>var Name: string);</p><p>var</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">ButtonPos: Integer;</font><font face="宋体" lang="ZH-CN"></p><p></font><font face="Arial">begin</p><p>ButtonPos := Pos('Button', Name);</p><p>if ButtonPos <> 0 then</p><p>Name := Copy(Name, 1, ButtonPos - 1) + 'PushButton' +</p><p>Copy(Name, ButtonPos + 6, Length(Name));</p><p>end;</p><p> </p><p>17. ReadValue</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function ReadValue: TValueType; </p><p>ReadValue</font><font face="宋体" lang="ZH-CN">方法读取流中紧着的项目的类型,函数返回后,流的指针移到值类型指示符之后。</p><p> </font><font face="Arial">TValueType</font><font face="宋体" lang="ZH-CN">是枚举类型。存储在</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象的流中的每个项目之前都有一个字节标识该项目的类型,在读每个项目之前都要读取该字节,以指导调用哪个方法来闱取项目。该字节的值就</font><fontface="Arial">TValuetype</font><font face="宋体" lang="ZH-CN">定义的值类型之一。</p><p> </font><font face="Arial">18. NextValue</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function Nextvalue: TValuetype; </p><p>Nextvalue</font><font face="宋体" lang="ZH-CN">方法的作用也是返回</font><fontface="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象流中紧接着的项目的类型,它与</font><fontface="Arial">ReadValue</font><font face="宋体" lang="ZH-CN">的区别在于并不移动指针位置。</p><p> </font><font face="Arial">19. ReadBoolean</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function ReadBoolean: Boolean; </p><p>ReadBoolean</font><font face="宋体" lang="ZH-CN">方法从</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象的流中读取一个布尔值,并相应地移动流位置指针。</p><p> </font><font face="Arial">20</font><font face="宋体" lang="ZH-CN">、</font><fontface="Arial">ReadChar</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function ReadChar: char; </p><p>ReadChar</font><font face="宋体" lang="ZH-CN">方法从</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象的流中读取一个字符。</p><p> </font><font face="Arial">21. ReadFloat</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function ReadFloat: Extended; </font><fontface="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">ReadFloat</font><font face="宋体" lang="ZH-CN">方法从流中读取浮点数。</p><p> </font><font face="Arial">20. ReadIdent</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function ReadIdent: string; </p><p>ReadIdent</font><font face="宋体" lang="ZH-CN">方法从流中读取标识符。</p><p> </font><font face="Arial">23. ReadInteger</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function ReadInteger: Longin</p><p>ReadInteger</font><font face="宋体" lang="ZH-CN">方法从流中读取整型数字。</font><fontface="Arial"></p><p>24.ReadString</font><font face="宋体" lang="ZH-CN">方法</p><p> 声明:</font><font face="Arial">function Read String: string; </font><fontface="宋体" lang="ZH-CN"></p><p> </font><font face="Arial">ReadString</font><font face="宋体" lang="ZH-CN">方法从</font><fontface="Arial">Reader</font><font face="宋体" lang="ZH-CN">对象的流中读取一个字符串,并返回字符串中的内容。该字符串是由</font><fontface="Arial">Writer</font><font face="宋体" lang="ZH-CN">对象的</font><fontface="Arial">WriteString</font><font face="宋体" lang="ZH-CN">方法写入。</p><p> </font><font face="Arial"></p><p>20.2.3.2 TReader</font><font face="宋体" lang="ZH-CN">对象的实现</p><p> </p><p> </font><font face="Arial">Filer</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">Filer</font><font face="宋体" lang="ZH-CN">对象将读写数据操作抽象化,包装成对象提供了大量的读写方法,方便了程序的调用。因此在应用程序中可以广泛使</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象,充分利用</font><fontface="Arial">Delphi</font><font face="宋体" lang="ZH-CN">的面向对象技术。而且</font><fontface="Arial">Filer</font><font face="宋体" lang="ZH-CN">对象与</font><fontface="Arial">Stream</font><font face="宋体" lang="ZH-CN">对象捆绑在一起,一方面可以在各种存储媒介中存取任意格式的数据;另一方面,由于充分利用面向对象的动态联编,各种读写方法的使用方法是一致的,因此,方法调用很简单。下面我们着重介绍</font><fontface="Arial">Reader </font><font face="宋体" lang="ZH-CN">对象中与读写数据操作有关的属性和方法的实现。</p><p> </font><font face="Arial">1. TReader</font><font face="宋体" lang="ZH-CN">属性的实现</p><p> 在</font><font face="Arial">TReader</font><font face="宋体" lang="ZH-CN">对象的属性实现中我们重点介绍</font><fontface="Arial">Position</font><font face="宋体" lang="ZH-CN">的实现。</p><p> </font><font face="Arial">Position</font><font face="宋体" lang="ZH-CN">属性的定义了使用了读写控制,它们分别是</font><fontface="Arial">GetPosition</font><font face="宋体" lang="ZH-CN">和</font><fontface="Arial">SetPosition</font><font face="宋体" lang="ZH-CN">方法。</p><p> </p><p></font><font face="Arial">TReader = class(TFiler)</p><p>private</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">function GetPosition: Longint;</font><font face="宋体"lang="ZH-CN"></p><p></font><font face="Arial">procedure SetPosition(Value: Longint);</font><fontface="宋体" lang="ZH-CN"></p><p></font><font face="Arial">public</p><p></font><font face="宋体" lang="ZH-CN">…</p><p></font><font face="Arial">property Position: Longint read GetPosition writeSetPosition;</p><p>end;</p><p></font> <font face="Arial"></p><p>Postition</font><font face="宋体" lang="ZH-CN">的读写控制方法如下:</p><p> </p><p></font><font face="Arial">function TReader.GetPosition: Longint;</p><p>begin</p><p>Result := FStream.Position + FBufPos;</p><p>end;</p><p></font> <font face="Arial"></p><p>procedure TReader.SetPosition(Value: Longint);</p><p>begin</p><p>FStream.Position := Value;</p><p>FBufPos := 0;</p><p>FBufEnd := 0;</p><p>end;</p><p></font> <font face="Arial"></p><p></font><font face="宋体" lang="ZH-CN">在</font><font face="Arial">TReader</font><fontface="宋体" lang="ZH-CN">的父对象</font><font face="Arial">TFiler</font><fontface="宋体" lang="ZH-CN">对象中介绍过</font><font face="Arial">FBufPos</font><fontface="宋体" lang="ZH-CN">和</font><font face="Arial">FBufEnd</font><font face="宋体"lang="ZH-CN">变量。</font><font face="Arial">Filer</font><font face="宋体"lang="ZH-CN">对象内部分配了一个</font><font face="Arial">BufSize</font><fontface="宋体" lang="ZH-CN">大小的缓冲区</font><font face="Arial">FBufPos</font><fontface="宋体" lang="ZH-CN">就是指在缓冲区中的相对位置,</font><fontface="Arial">FBufEnd</font><font face="宋体" lang="ZH-CN">是指在缓冲区中数据结束处的位置</font><fontface="Arial">(</font><font face="宋体" lang="ZH-CN">缓冲区中的数据不一定会充满整个缓冲区</font><fontface="Arial">)</font><font face="宋体" lang="ZH-CN">。</font><font face="Arial"></p><p></font><font face="宋体" lang="ZH-CN"> 在</font><font face="Arial">GetPosition</font><fontface="宋体" lang="ZH-CN">方法中可以看到</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象的</font><font face="Arial">Position</font><fontface="宋体" lang="ZH-CN">值和</font><font face="Arial">Stream</font><fontface="宋体" lang="ZH-CN">对象的</font><font face="Arial">Position</font><fontface="宋体" lang="ZH-CN">值是不同的。</font><font face="Arial">Reader</font><fontface="宋体" lang="ZH-CN">对象多了一个</font><font face="Arial">FButPos</font><font
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -