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

Delphi DFM 文件與文本腳本雙向轉換:核心算法與 VCL 內部實現

     編輯:Delphi

20.3.1.4 DFM 文件與標準文本文件 (TXT) 相互轉換

Delphi IDE 支援以文本形式瀏覽/修改 DFM(View as Text),稱為「表單設計腳本」。此功能補強可視化設計,但受限於代碼與 DFM 緊密關聯,任意增刪易致不一致。動態 DFM 無此限制。

VCL Classes 單元提供四核心程序:

  • ObjectBinaryToText / ObjectTextToBinary:二進制串流元件 ↔ 文本表現
  • ObjectResourceToText / ObjectTextToResource:DFM 資源檔 ↔ 文本腳本

ObjectBinaryToText 核心實現

將二進制串流元件轉為文本,支援文本處理(查找/替換),再轉回二進制。主流程:

procedure ObjectBinaryToText(Input, Output: TStream);
var NestingLevel: Integer; Reader: TReader; Writer: TWriter;
begin
  NestingLevel := 0;
  Reader := TReader.Create(Input, 4096);
  Writer := TWriter.Create(Output, 4096);
  try
    Reader.ReadSignature;
    ConvertObject; { 遞歸轉換每個元件 }
  finally Writer.Free; Reader.Free; end;
end;

ConvertObject 遞歸處理嵌套結構:

procedure ConvertObject;
begin
  ConvertHeader;           { 處理繼承標誌:Inherited 或 Object }
  Inc(NestingLevel);
  while not Reader.EndOfList do ConvertProperty; { 屬性轉換 }
  Reader.ReadListEnd;
  while not Reader.EndOfList do ConvertObject;   { 子元件遞歸 }
  Reader.ReadListEnd;
  Dec(NestingLevel);
  WriteIndent; WriteStr('end'#13#10);
end;

ConvertProperty 輸出「縮排 + 屬性名 = 值 + 換行」,ConvertValue 依型別轉字串。WriteIndent 依層級寫入空格。

ObjectTextToBinary 反向轉換

將符合 DFM 腳本語法的任意文本轉為二進制元件,奠定動態 DFM 生成編輯基礎。同樣採遞歸 ConvertObject,解析 INHERITED/OBJECT 標記、屬性、子元件,遇 END 結束。

DFM 資源檔與腳本互轉

ObjectResourceToText:讀資源頭 → 呼叫 ObjectBinaryToText。
ObjectTextToResource:文本 → 二進制 (MemoryStream) → 解析繼承標誌 → 重建資源頭 (含 $FF、版本、大小等) → 寫入輸出串流。

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