TReader對象
TReader對象是可實例化的用於從相聯系的流中讀取數據的Filer對象TReader對象從TFiler繼承下來除了從TFiler繼承的屬性和方法外TReader聲明了不少屬性方法和事件
Owner和Parent屬性用於表示從Reader對象的流中讀取的部件的擁有者和雙親結點OnErrorOnFindMethod和OnSetName事件使應用程序在運行中讀數據時能定制響應方式除了覆蓋了一些從TFiler對象中繼承的方法外TReader對象還定義大量的讀不同類型的數據和觸發事件的方法
TReader對象的屬性和方法
Owner屬性
聲明
property Owner: TComponent;
Reader對象的Owner屬性存儲了將用來給從Reader的流中讀出的部件的Owner屬性賦值的部件
Parent屬性
聲明
property Parent: TComponent;
Parent屬性存儲將用來給從Reader的流中讀出所有控制的Parent屬性賦值的部件
Position屬性
聲明
propertion: Longint;
Reader對象的Position屬性表示相聯的流中讀的當前位置Position的值還應包括讀緩沖區的大小對於Reader 對象Position的值大於流的Position 的值如果將Position的值設得超過當前緩沖區將引起調用FlushBuffer
BeginReferences方法
聲明
procedure BeginReferences;
BeginReferences方法啟動一連串關於讀部件的命令這些部件包含相互間的交叉引用在使用上通常和FixupReferences和EndReferences一起放在Try…finally程序塊中
在調用了BeginReferences後Reader對象創建讀取所有對象和名字的列表所有的獨立對象被讀出後調用FixupReferences方法將名字的相互從流中轉移到對象實例中最後調用EndReferences方法釋放列表
處理部件相互引用的程序塊形式如下
BeginReferences; { 創建臨時列表 }
try
{ 讀出所有部件並將它們的名字放在一臨時列表中 }
…
FixupReferences; { 分 解 }
finally
EndReferences; { 釋放臨時列表 }
end;
FixUpReferences方法
聲明
procedure FixupReferences;
FixupReferences方法分解從流中讀出的存在各種相互依賴部件的引用關系FixupReferences總在try…finally塊中並配合BeginReferences和EndReferences一起使用
EndReferences方法
聲明
procedure EndReferences;
EndReferences方法終止處理相互引用的塊操作釋放對象列表它總配合BeginReferences和FixupReferences一起使用
ReadListBegin方法
聲明
procedure ReadListBegin;
ReadListBegin方法從Reader對象相聯的流中讀取列表開始標志如果流中緊接著要讀取的項目不是一個由WritelistBegin方法寫入的列表起始標志ReadListBegin將引起一個讀異常事件
通常在調用ReadlistBegin方法之後緊跟著一個讀項目的循環循環以EndfList方法返回True 終止條件這時預示流中的下一個項目是列表結束標志需要調用ReadListEnd方法
ReadListEnd方法
聲明
procedure ReadListEnd;
ReadListEnd 方法從流中讀取列表結束標志如果所讀的項目不是一個列表結束標志ReadListEnd方法引發一個EReadError異常事件
EndOfList方法
聲明
function EndOfList: Boolean;
如果Reader對象讀到項目列表結果標志EndOfList方法返回True
TStrings對象在從Reader對象讀取項目列表時使用了ReadListBegin和ReadListEnd方法下面的ReadData是TStrings的方法用於在DefineProperties方面中讀string數據
procedure TStringsReadData(Reader: TReader)
begin
ReaderReadListBegin; { 讀列表開始標志 }
Clear; { 清除已有的字符串 }
while not ReaderEndOfList do { 只要還有數據 … }
Add(ReaderReadString) { …讀一個字符串並將其加在列表中 }
ReaderReadListEnd; { 越過列表結束標志 }
end;
ReadSignature方法
聲明
procedure ReadSignature;
ReadSignature方法從流中讀取部件之前首先調用ReadSignature方法在載入對象之前檢測標簽Reader對象就能防止疏忽大意導致讀取無效或過時的數據Filer標簽是四個字符對於Delphi 該標簽是TPF
ReadPrefix方法
聲明
procedure ReadPrefix(var Plags: TFilerFlags; var AChild
Pos: Integer)
ReadPrefix方法的功能與ReadSignature的很相象只不過它是讀取流中部件前面的標志(PreFix)當一個Write對象將部件寫入流中時它在部件前面預寫了兩個值第一個值是指明部件是否是從祖先窗體中繼承的窗體和它在窗體中的位置是否重要的標志第二個值指明它在祖先窗體創建次序ReadComponent方法自動調用ReadPrefix但如果需要獨立讀取部件的預讀標志也可直接調用該方向
OnFindMethod事件
聲明
property OnFindMethod: TFindMethodEvent;
OnFindMethod事件發生在Reader對象讀取對象的方法指針時屬性為方法指針的通常都是事件
響應OnFindMethod事件的理由通常是處理過程找不到方法的情況在FindMethod方法沒有找到由Name指定的方法的情況下如果它將OnFindMethod方法的Error 參數設為True將引起ReadError異常事件反之將Error參數置為False將防止FindMethod方法引發異常事件
Error方法
聲明
function Error(const Message: String)
Boolean; virtual;
Error方法定義在Reader對象的protected部分它是用於Reader對象的OnError事件其返回值決定是否繼續錯誤處理過程如果返回值為True則表示用程序應當繼續錯誤處理如果返回值為False則表示錯誤情況被忽略
如果讀部件或屬性出錯Reader對象調用Error方法缺省情況下Error將返回值設為False然後調用OnError事件處理過程
TReader對象總是在try…except程序塊的except部分並提供用戶忽略錯誤的機會Error的使用方法如下
try
… { 讀部件 }
except
on E: Exception do
begin
…{ 執行一些清除操作 }
if Error(EMessage) then raise;
end;
end;
OnError事件
聲明
property OnError: TReaderError;
當Reader對象讀取數據出錯時將引發OnError事件通過處理OnError事件可以有選擇地處理或忽略錯誤
傳給OnError事件處理過程的最後一個參數是名為Handled的var參數在缺省情況下Error方法將Handled置為True這將阻止錯誤更進一步處理如果事件處理過程仍舊將Handled置為FalseReader對象將引發一個EReadError異常事件
SetName方法
聲明
procedure SetName(Component: TComponent; var Name: String virtual)
SetName方法允許Reader對象在將從流中讀取的部件的Name值賦給部件的Name屬性前修改Name值ReadComponent方法在讀取部件的屬性值和其它數據前先讀部件的類型和名字在讀完名字後ReadComponent將所讀的名字作為Name參數傳給SetNameName 是個var參數因此SetName能在返回前修改字符串值SetName還調用了OnSetName事件處理過程將名字字符串作為var參數傳入事件處理過程中因此事件處理過程也可修改字符串的值
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25092.html