Delphi 10.2加载自定义资源图片异常,旧图无法覆盖求助
Delphi 10.2运行时加载资源图片显示旧图及Access Violation问题解决思路
以下是针对问题的具体排查和解决步骤:
彻底清理编译缓存与旧产物
- 除了删除项目目录下的
project.res和project.dres,还要手动删除所有*.dcu、*.o、*.obj编译中间文件,这类文件常缓存旧资源。 - 清理Delphi IDE的临时缓存目录,默认路径为
C:\Users\<你的用户名>\AppData\Local\Embarcadero\BDS\19.0\Cache,删除该目录下所有文件。 - 确认
Img\logo1.jpg文件本身是最新的,避免修改了错误的图片文件。
- 除了删除项目目录下的
重新编译资源文件并验证正确性
- 使用Delphi自带的
brcc32工具重新编译logo.rc:打开命令提示符,切换到项目目录,执行命令:
确保编译过程无报错,生成的brcc32 logo.rclogo.res是最新版本。 - 检查
logo.rc中的路径是否正确:Img\logo1.jpg是相对于项目根目录的路径,确认Img文件夹确实在项目目录下,路径错误会导致加载旧资源或无效资源。 - 排查资源名冲突:检查项目中其他
.rc/.res文件是否也定义了Image1同名资源,资源重名会导致加载顺序靠前的资源被优先调用。
- 使用Delphi自带的
修正资源加载代码的错误
你提供的代码存在两处问题:- 类名拼写错误:
TResourseStream应为TResourceStream。 - 缺少
end;闭合try-finally块。
修正后的代码如下:
var MyStream: TResourceStream; begin MyStream := TResourceStream.Create(HInstance, 'Image1', RT_RCDATA); try MyImage.Picture.LoadFromStream(MyStream); finally MyStream.Free; end; end;同时确保
MyImage是已正确创建的TImage组件,未被意外置为nil。- 类名拼写错误:
解决Access Violation异常
- 不能直接移除
{$R *.RES},该指令引用的是项目默认资源文件,包含窗体DFM等必要资源,移除会导致窗体资源加载失败引发AV。 - 使用Resource Hacker等工具打开生成的EXE文件,查看RCDATA类型下的
Image1资源,确认其对应的图片是否为最新版本,以此判断是资源未正确编译进EXE,还是加载逻辑的问题。 - 尝试手动加载资源的方式排查问题,替代
TResourceStream:var hRes: THandle; pRes: Pointer; ResSize: DWORD; MyStream: TMemoryStream; begin hRes := FindResource(HInstance, 'Image1', RT_RCDATA); if hRes = 0 then Exit; ResSize := SizeOfResource(HInstance, hRes); pRes := LoadResource(HInstance, hRes); if pRes = nil then Exit; MyStream := TMemoryStream.Create; try MyStream.WriteBuffer(pRes^, ResSize); MyStream.Position := 0; MyImage.Picture.LoadFromStream(MyStream); finally MyStream.Free; FreeResource(hRes); end; end;
- 不能直接移除
其他排查方向
- 关闭Delphi IDE的增量编译功能:打开项目选项 -> 编译 -> 取消勾选“增量编译”,然后执行全量编译。
- 重启Delphi IDE,避免IDE缓存旧资源数据。
- 若使用版本控制工具,确认本地
Img文件夹下的图片未被版本控制还原为旧版本。
内容的提问来源于stack exchange,提问作者Lena Gavrilov
相关产品推荐
相关产品推荐

