首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi TReader 物件深度解析:動態 DFM 讀取核心引擎與事件驅動擴展機制

     編輯:Delphi

20.2.3 TReader 物件

TReader 為可實例化的讀取型 Filer,繼承自 TFiler,新增屬性 Owner、Parent、Position,事件 OnError、OnFindMethod、OnSetName,並定義大量讀取各類資料與觸發事件的方法。

20.2.3.1 TReader 核心屬性與方法

  • Owner/Parent:指定讀出元件的 Owner 與 Parent 屬性值
  • Position:目前讀取位置(含緩衝區偏移),設定超出緩衝區觸發 FlushBuffer
  • BeginReferences / FixupReferences / EndReferences:處理元件交叉引用的三階段模式(建立臨時列表 → 解析名稱轉實例 → 釋放列表)
  • ReadListBegin / ReadListEnd / EndOfList:讀取列表標誌 (vaList/vaNull),配合迴圈讀取項目
  • ReadSignature:讀取 Filer 標誌 TPF0,防止讀取無效資料
  • ReadPrefix:讀取元件前綴標誌 (ffInherited/ffChildPos) 與建立序號
  • OnFindMethod:讀取方法指標(事件)時觸發,可動態指派方法位址、控制 Error 參數抑制異常
  • Error:protected 虛擬方法,預設回傳 False 忽略錯誤,配合 try...except 讓使用者決定是否重拋異常
  • OnError:讀取錯誤時觸發,Handled 參數控制是否進一步處理
  • SetName:設定元件 Name 前允許修改名稱字串,觸發 OnSetName
  • OnSetName:var Name 參數允許過濾/重命名元件(如將含「Button」者改為「PushButton」)

20.2.3.2 TReader 實現細節

1. Position 屬性實現

function TReader.GetPosition: Longint;
begin Result := FStream.Position + FBufPos; end;

procedure TReader.SetPosition(Value: Longint);
begin
  FStream.Position := Value;
  FBufPos := 0; FBufEnd := 0;
end;

FBufPos/FBufEnd 為緩衝區內部位置。GetPosition 含緩衝區偏移,SetPosition 重置緩衝區。

2-4. 簡單資料型別讀取方法

所有讀取方法先呼叫 ReadValue 取得型別標誌 (TValueType),符合則讀取資料,否則觸發 PropValueError。支援:Integer (8/16/32-bit)、Boolean (型別標誌即值)、String (長度前綴)、Float (可轉換整數)、Char (特殊 vaString 長度 1)、Ident (標識符/True/False/nil)。

5. DefineProperty / DefineBinaryProperty

比對屬性名相同則執行讀取。二進制屬性建立 TMemoryStream 讀入長度與資料,再呼叫 ReadData。

6. FlushBuffer

同步 Reader 與串流位置:FStream.Position := FStream.Position - (FBufEnd - FBufPos),重置緩衝區指標。

7. 列表處理

ReadListBegin 檢查 vaList,ReadListEnd 檢查 vaNull,EndOfList 偵測 vaNull 並回退一位元組。內部 CheckValue 封裝檢查與錯誤觸發邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved