Delphi IDE 支援以文本形式瀏覽/修改 DFM(View as Text),稱為「表單設計腳本」。此功能補強可視化設計,但受限於代碼與 DFM 緊密關聯,任意增刪易致不一致。動態 DFM 無此限制。
VCL Classes 單元提供四核心程序:
ObjectBinaryToText / ObjectTextToBinary:二進制串流元件 ↔ 文本表現ObjectResourceToText / ObjectTextToResource:DFM 資源檔 ↔ 文本腳本將二進制串流元件轉為文本,支援文本處理(查找/替換),再轉回二進制。主流程:
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 依層級寫入空格。
將符合 DFM 腳本語法的任意文本轉為二進制元件,奠定動態 DFM 生成編輯基礎。同樣採遞歸 ConvertObject,解析 INHERITED/OBJECT 標記、屬性、子元件,遇 END 結束。
ObjectResourceToText:讀資源頭 → 呼叫 ObjectBinaryToText。
ObjectTextToResource:文本 → 二進制 (MemoryStream) → 解析繼承標誌 → 重建資源頭 (含 $FF、版本、大小等) → 寫入輸出串流。