?? 054.htm
字號:
face="宋體" lang="ZH-CN">事件。其返回值決定是否繼續錯誤處理過程。如果返回值為</font><font
face="Arial">True</font><font face="宋體" lang="ZH-CN">,則表示用程序應當繼續錯誤處理;如果返回值為</font><font
face="Arial">False</font><font face="宋體" lang="ZH-CN">,則表示錯誤情況被忽略。</p>
<p> 如果讀部件或屬性出錯。</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象調用</font><font face="Arial">Error</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">OnError</font><font
face="宋體" lang="ZH-CN">事件處理過程。</p>
<p> </font><font face="Arial">TReader</font><font face="宋體" lang="ZH-CN">對象總是在</font><font
face="Arial">try</font><font face="宋體" lang="ZH-CN">…</font><font face="Arial">except</font><font
face="宋體" lang="ZH-CN">程序塊的</font><font face="Arial">except</font><font
face="宋體" lang="ZH-CN">部分,并提供用戶忽略錯誤的機會。</font><font
face="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><font
face="宋體" 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><font
face="宋體" 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><font
face="宋體" lang="ZH-CN">對象讀取數據出錯時將引發</font><font face="Arial">OnError</font><font
face="宋體" lang="ZH-CN">事件。通過處理</font><font face="Arial">OnError</font><font
face="宋體" lang="ZH-CN">事件,可以有選擇地處理或忽略錯誤。</p>
<p> 傳給</font><font face="Arial">OnError</font><font face="宋體" lang="ZH-CN">事件處理過程的最后一個參數是名為</font><font
face="Arial">Handled</font><font face="宋體" lang="ZH-CN">的</font><font face="Arial">var</font><font
face="宋體" lang="ZH-CN">參數。在缺省情況下,</font><font face="Arial">Error</font><font
face="宋體" lang="ZH-CN">方法將</font><font face="Arial">Handled</font><font
face="宋體" lang="ZH-CN">置為</font><font face="Arial">True</font><font face="宋體"
lang="ZH-CN">。這將阻止錯誤更進一步處理。如果事件處理過程仍舊將</font><font
face="Arial">Handled</font><font face="宋體" lang="ZH-CN">置為</font><font
face="Arial">False</font><font face="宋體" lang="ZH-CN">,</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象將引發一個</font><font face="Arial">EReadError</font><font
face="宋體" 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; var
Name: String virtual); </p>
<p>SetName</font><font face="宋體" lang="ZH-CN">方法允許</font><font face="Arial">Reader</font><font
face="宋體" lang="ZH-CN">對象在將從流中讀取的部件的</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">值賦給部件的</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">屬性前修改</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">值。</font><font face="Arial">ReadComponent</font><font
face="宋體" lang="ZH-CN">方法在讀取部件的屬性值和其它數據前先讀部件的類型和名字在讀完名字后,</font><font
face="Arial">ReadComponent</font><font face="宋體" lang="ZH-CN">將所讀的名字作為</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">參數傳給</font><font
face="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><font
face="宋體" lang="ZH-CN">參數,因此</font><font face="Arial">SetName</font><font
face="宋體" lang="ZH-CN">能在返回前修改字符串值。</font><font face="Arial">SetName</font><font
face="宋體" lang="ZH-CN">還調用了</font><font face="Arial">OnSetName</font><font
face="宋體" lang="ZH-CN">事件處理過程,將名字字符串作為</font><font
face="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><font
face="Arial">Read</font><font face="宋體" lang="ZH-CN">對象設置部件的</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">屬性前,</font><font
face="Arial">OnSetName</font><font face="宋體" lang="ZH-CN">事件處理過程的</font><font
face="Arial">var</font><font face="宋體" lang="ZH-CN">參數</font><font face="Arial">Name</font><font
face="宋體" lang="ZH-CN">參數是一個</font><font face="Arial">var</font><font
face="宋體" lang="ZH-CN">參數,因此,事件處理過程再將</font><font
face="Arial">Name</font><font face="宋體" lang="ZH-CN">賦給部件前,可以修改</font><font
face="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><font
face="宋體" lang="ZH-CN">”的部件,并用“</font><font face="Arial">PushButton</font><font
face="宋體" 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><font
face="Arial">Filer</font><font face="宋體" lang="ZH-CN">對象的流中的每個項目之前都有一個字節標識該項目的類型,在讀每個項目之前都要讀取該字節,以指導調用哪個方法來闈取項目。該字節的值就</font><font
face="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><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象流中緊接著的項目的類型,它與</font><font
face="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><font
face="宋體" lang="ZH-CN">對象的流中讀取一個布爾值,并相應地移動流位置指針。</p>
<p> </font><font face="Arial">20</font><font face="宋體" lang="ZH-CN">、</font><font
face="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><font
face="宋體" 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><font
face="宋體" 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><font
face="Arial"></p>
<p>24.ReadString</font><font face="宋體" lang="ZH-CN">方法</p>
<p> 聲明:</font><font face="Arial">function Read String: string; </font><font
face="宋體" lang="ZH-CN"></p>
<p> </font><font face="Arial">ReadString</font><font face="宋體" lang="ZH-CN">方法從</font><font
face="Arial">Reader</font><font face="宋體" lang="ZH-CN">對象的流中讀取一個字符串,并返回字符串中的內容。該字符串是由</font><font
face="Arial">Writer</font><font face="宋體" lang="ZH-CN">對象的</font><font
face="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><font
face="Arial">Delphi</font><font face="宋體" lang="ZH-CN">用來在</font><font
face="Arial">DFM</font><font face="宋體" lang="ZH-CN">文件中讀寫各種類型的數據(包括部件對象)。這些數據的一個本質特征是變長,而且</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">Delphi</font><font face="宋體" lang="ZH-CN">的面向對象技術。而且</font><font
face="Arial">Filer</font><font face="宋體" lang="ZH-CN">對象與</font><font
face="Arial">Stream</font><font face="宋體" lang="ZH-CN">對象捆綁在一起,一方面可以在各種存儲媒介中存取任意格式的數據;另一方面,由于充分利用面向對象的動態聯編,各種讀寫方法的使用方法是一致的,因此,方法調用很簡單。下面我們著重介紹</font><font
face="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><font
face="Arial">Position</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">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><font
face="宋體" 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 write
SetPosition;</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><font
face="宋體" lang="ZH-CN">的父對象</font><font face="Arial">TFiler</font><font
face="宋體" lang="ZH-CN">對象中介紹過</font><font face="Arial">FBufPos</font><font
face="宋體" 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><font
face="宋體" lang="ZH-CN">大小的緩沖區</font><font face="Arial">FBufPos</font><font
face="宋體" lang="ZH-CN">就是指在緩沖區中的相對位置,</font><font
face="Arial">FBufEnd</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">。</font><font face="Arial"></p>
<p></font><font face="宋體" lang="ZH-CN"> 在</font><font face="Arial">GetPosition</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">Stream</font><font
face="宋體" lang="ZH-CN">對象的</font><font face="Arial">Position</font><font
face="宋體" lang="ZH-CN">值是不同的。</font><font face="Arial">Reader</font><font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -