私有嵌套类重载构造函数调用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
相关产品推荐
相关产品推荐

