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

私有嵌套类重载构造函数调用Inherited Create遇EResNotFound错误求解

解决Delphi嵌套表单资源找不到的问题

问题核心是:当TEmailForm作为TEmail托管记录的私有嵌套类时,Delphi会将其类名解析为TEmail.TEmailForm,但表单的DFM资源默认绑定的是简单类名TEmailForm,调用继承的Create(AOwner)时,系统会去查找带嵌套前缀的资源名称,导致抛出EResNotFound异常。

以下是几种可行的解决办法:

  • 手动指定资源名称调用构造函数
    直接在继承调用时传入正确的资源名称,让系统加载TEmailForm对应的DFM:

    constructor TEmail.EmailForm.Create(AOwner: TComponent; EmailPnt: PEmail);
    begin
      // 明确指定资源名称为TEmailForm,而非自动生成的TEmail.TEmailForm
      inherited Create(AOwner, 'TEmailForm');
      Email := EmailPnt;
    end;
    
  • 调整资源编译指令绑定正确类名
    修改DFM的编译指令,将资源直接关联到嵌套类的完整名称TEmail.TEmailForm上:

    type
      TEmail = record
      private
        type
          TEmailForm = class(TForm)
            // 表单控件声明
          private
            Email: PEmail;
          public
            constructor Create(AOwner: TComponent; EmailPnt: PEmail); reintroduce;
          end;
      end;
    // 将TEmailForm.dfm资源绑定到TEmail.TEmailForm类
    {$R TEmailForm.dfm TEmail.TEmailForm}
    

    这样编译后,系统就能通过嵌套类的完整名称找到对应的资源。

  • 用CreateNew手动加载资源
    先创建无资源的表单实例,再手动从DFM文件加载资源,绕开系统默认的资源查找逻辑:

    constructor TEmail.EmailForm.Create(AOwner: TComponent; EmailPnt: PEmail);
    var
      ResStream: TResourceStream;
    begin
      inherited CreateNew(AOwner);
      try
        // 直接加载TEmailForm的DFM资源
        ResStream := TResourceStream.Create(HInstance, 'TEmailForm', RT_RCDATA);
        try
          ResStream.Position := 0;
          LoadFromStream(ResStream);
        finally
          ResStream.Free;
        end;
      except
        Free;
        raise;
      end;
      Email := EmailPnt;
    end;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:19:52