You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11/12运行时如何通过代码访问窗体DFM资源?

在Delphi中运行时访问窗体DFM资源的方法

核心思路

Delphi编译时会将窗体的DFM作为RT_RCDATA类型的资源嵌入到可执行文件中,每个窗体类的ResourceName属性对应其DFM资源的名称,通过这个名称可以直接读取并转换为可读格式。

方法一:使用资源流读取并转换

通过TResourceStream加载DFM资源,再用ObjectBinaryToText将默认的二进制DFM转换为可读文本:

function GetFormDFMContent(FormClass: TFormClass): string;
var
  ResStream: TResourceStream;
  TextStream: TStringStream;
begin
  Result := '';
  try
    // 创建资源流读取目标窗体的DFM资源
    ResStream := TResourceStream.Create(HInstance, FormClass.ResourceName, RT_RCDATA);
    try
      TextStream := TStringStream.Create('', TEncoding.UTF8);
      try
        // 将二进制DFM转换为可解析的文本格式
        ObjectBinaryToText(ResStream, TextStream);
        TextStream.Position := 0;
        Result := TextStream.DataString;
      finally
        TextStream.Free;
      end;
    finally
      ResStream.Free;
    end;
  except
    // 捕获资源不存在、格式异常等情况
  end;
end;

方法二:针对已实例化的窗体访问

如果窗体已经创建,可直接通过实例的ResourceName属性读取,逻辑与上述一致:

var
  MyForm: TMyForm;
  DFMContent: string;
begin
  MyForm := TMyForm.Create(nil);
  try
    DFMContent := GetFormDFMContent(TMyForm);
    // 后续可基于DFM文本生成HTML等格式
  finally
    MyForm.Free;
  end;
end;

关键注意事项

  • DFM格式适配:默认编译生成二进制DFM,必须用ObjectBinaryToText转换为文本才能解析;若项目设置为「文本DFM」(项目选项→Delphi编译器→编译→生成文本DFM),可直接读取为文本内容。
  • 包资源适配:如果窗体位于动态链接包(BPL)中,需将HInstance替换为包的模块句柄(可通过GetModuleHandle传入包名获取)。
  • 版本兼容性:上述代码在Delphi 11和12中完全兼容,无需修改。

内容的提问来源于stack exchange,提问作者MichaSchumann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:35:00