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

Delphi TReader 元件讀取方法完整實現:從 ReadSignature 到 ReadRootComponent

     編輯:Delphi

6. 讀取元件方法的實現

TReader 提供 ReadSignature、ReadPrefix、ReadComponent、ReadComponents、ReadRootComponent 五大核心方法。

ReadSignature

讀取 4 位元組標誌,驗證為 TPF0 (FilerSignature),否則觸發 SInvalidImage 異常。

ReadPrefix

讀取前綴位元組:高 4 位 $F 標識,低 4 位為 TFilerFlags (ffInherited、ffChildPos)。若 ffChildPos 置位,緊接讀取整數建立序號。

ReadComponent

核心邏輯:

  1. 呼叫 ReadPrefix 取得標誌與序號
  2. 讀取類別名與元件名
  3. 若參數 Component=nil:
     - ffInherited 置位 → FindExistingComponent 尋找現有元件
     - 否則 → CreateComponent 從類別表建立新實例
  4. 結果非空則:
     - 標記 csLoading/csReading
     - 非繼承則 SetCompName 設定名稱
     - 呼叫 ReadState 讀取屬性
     - ffChildPos 置位 → Parent.SetChildOrder 恢復建立順序
     - 加入 FLoaded 列表
  5. 異常時若元件為新建則釋放並重拋

ReadComponents

批次讀取關聯元件:設定 Root/Owner/Parent,BeginReferences,迴圈 ReadSignature + ReadComponent(nil) + 處理程序,FixupReferences 解析引用,EndReferences 釋放。採 BeginReferences/FixupReferences/EndReferences 巢狀模式重建相互引用。

ReadRootComponent

讀取根元件及其擁有樹:

  1. ReadSignature 驗證標誌
  2. try...except 保護區塊
  3. ReadPrefix 取得標誌
  4. 若 Root=nil:讀類別名建立實例,讀名稱設 Name;否則忽略類別名,設計期讀名稱,執行期呼叫 FindUniqueName 確保唯一
  5. 設定 FRoot、FLoaded (全域或新建 TList),標記 csLoading/Reading
  6. 呼叫 FRoot.ReadState 讀取屬性與子元件
  7. 若無全域 GlobalLoaded,遍歷 FLoaded 呼叫各元件 Loaded
  8. GlobalFixupReferences 全域修正引用
  9. 異常處理:RemoveFixupReferences、釋放新建根元件、重拋
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved