14. OnError事件
聲明:property OnError: TReaderError;
當Reader對象讀取數據出錯時將引發OnError事件。通過處理OnError事件,可以有選擇地處理或忽略錯誤。
傳給OnError事件處理過程的最後一個參數是名為Handled的var參數。在缺省情況下,Error方法將Handled置為True。這將阻止錯誤更進一步處理。如果事件處理過程仍舊將Handled置為False,Reader對象將引發一個EReadError異常事件。
15. SetName方法
聲明:procedure SetName(Component: TComponent; var Name: String virtual);
SetName方法允許Reader對象在將從流中讀取的部件的Name值賦給部件的Name屬性前修改Name值。ReadComponent方法在讀取部件的屬性值和其它數據前先讀部件的類型和名字在讀完名字後,ReadComponent將所讀的名字作為Name參數傳給SetName,Name 是個var參數,因此SetName能在返回前修改字符串值。SetName還調用了OnSetName事件處理過程,將名字字符串作為var參數傳入事件處理過程中,因此,事件處理過程也可修改字符串的值。
16. OnSetName事件
聲明:property OnSetName: TSetNameEvent;
OnSetName事件發生在Read對象設置部件的Name屬性前,OnSetName事件處理過程的var參數Name參數是一個var參數,因此,事件處理過程再將Name賦給部件前,可以修改Name的值。這對於想過濾窗體中部件的名字是很有幫助的。
下面的OnSetName事件處理過程,命名了名字中包含“Button”的部件,並用“PushButton”替代。
procedure TForm1.ReaderSetName(Reader: TReader; Component: TComponent;
var Name: string);
var
ButtonPos: Integer;
begin
ButtonPos := Pos('Button', Name);
if ButtonPos <> 0 then
Name := Copy(Name, 1, ButtonPos - 1) + 'PushButton' +
Copy(Name, ButtonPos + 6, Length(Name));
end;
17. ReadValue方法
聲明:function ReadValue: TValueType;
ReadValue方法讀取流中緊著的項目的類型,函數返回後,流的指針移到值類型指示符之後。
TValueType是枚舉類型。存儲在Filer對象的流中的每個項目之前都有一個字節標識該項目的類型,在讀每個項目之前都要讀取該字節,以指導調用哪個方法來闱取項目。該字節的值就TValuetype定義的值類型之一。
18. NextValue方法
聲明:function Nextvalue: TValuetype;
Nextvalue方法的作用也是返回Reader對象流中緊接著的項目的類型,它與ReadValue的區別在於並不移動指針位置。
19. ReadBoolean方法
聲明:function ReadBoolean: Boolean;
ReadBoolean方法從Reader對象的流中讀取一個布爾值,並相應地移動流位置指針。
20、ReadChar方法
聲明:function ReadChar: char;
ReadChar方法從Reader對象的流中讀取一個字符。
21. ReadFloat方法
聲明:function ReadFloat: Extended;
ReadFloat方法從流中讀取浮點數。
20. ReadIdent方法
聲明:function ReadIdent: string;
ReadIdent方法從流中讀取標識符。
23. ReadInteger方法
聲明:function ReadInteger: Longin
ReadInteger方法從流中讀取整型數字。
24.ReadString方法
聲明:function Read String: string;
ReadString方法從Reader對象的流中讀取一個字符串,並返回字符串中的內容。該字符串是由Writer對象的WriteString方法寫入。
20.2.3.2 TReader對象的實現
Filer對象的作用主要是Delphi用來在DFM文件中讀寫各種類型的數據(包括部件對象)。這些數據的一個本質特征是變長,而且Filer對象將讀寫數據操作抽象化,包裝成對象提供了大量的讀寫方法,方便了程序的調用。因此在應用程序中可以廣泛使Filer對象,充分利用Delphi的面向對象技術。而且Filer對象與Stream對象捆綁在一起,一方面可以在各種存儲媒介中存取任意格式的數據;另一方面,由於充分利用面向對象的動態聯編,各種讀寫方法的使用方法是一致的,因此,方法調用很簡單。下面我們著重介紹Reader 對象中與讀寫數據操作有關的屬性和方法的實現。
1. TReader屬性的實現
在TReader對象的屬性實現中我們重點介紹Position的實現。
Position屬性的定義了使用了讀寫控制,它們分別是GetPosition和SetPosition方法。
TReader = class(TFiler)
private
…
function GetPosition: Longint;
procedure SetPosition(Value: Longint);
public
…
property Position: Longint read GetPosition write SetPosition;
end;
Postition的讀寫控制方法如下:
function TReader.GetPosition: Longint;
begin
Result := FStream.Position + FBufPos;
end;
procedure TReader.SetPosition(Value: Longint);
begin
FStream.Position := Value;
FBufPos := 0;
FBufEnd := 0;
end;
在TReader的父對象TFiler對象中介紹過FBufPos和FBufEnd變量。Filer對象內部分配了一個BufSize大小的緩沖區FBufPos就是指在緩沖區中的相對位置,FBufEnd是指在緩沖區中數據結束處的位置(緩沖區中的數據不一定會充滿整個緩沖區)。
在GetPosition方法中可以看到Reader對象的Position值和Stream對象的Position值是不同的。Reader對象多了一個FButPos的編移量。