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

Delphi 10.2加载自定义资源图片异常,旧图无法覆盖求助

Delphi 10.2运行时加载资源图片显示旧图及Access Violation问题解决思路

以下是针对问题的具体排查和解决步骤:

  • 彻底清理编译缓存与旧产物

    1. 除了删除项目目录下的project.res和project.dres,还要手动删除所有*.dcu、*.o、*.obj编译中间文件,这类文件常缓存旧资源。
    2. 清理Delphi IDE的临时缓存目录,默认路径为C:\Users\<你的用户名>\AppData\Local\Embarcadero\BDS\19.0\Cache,删除该目录下所有文件。
    3. 确认Img\logo1.jpg文件本身是最新的,避免修改了错误的图片文件。
  • 重新编译资源文件并验证正确性

    1. 使用Delphi自带的brcc32工具重新编译logo.rc:打开命令提示符,切换到项目目录,执行命令:
      brcc32 logo.rc
      
      确保编译过程无报错,生成的logo.res是最新版本。
    2. 检查logo.rc中的路径是否正确:Img\logo1.jpg是相对于项目根目录的路径,确认Img文件夹确实在项目目录下,路径错误会导致加载旧资源或无效资源。
    3. 排查资源名冲突:检查项目中其他.rc/.res文件是否也定义了Image1同名资源,资源重名会导致加载顺序靠前的资源被优先调用。
  • 修正资源加载代码的错误
    你提供的代码存在两处问题:

    1. 类名拼写错误:TResourseStream应为TResourceStream。
    2. 缺少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异常

    1. 不能直接移除{$R *.RES},该指令引用的是项目默认资源文件,包含窗体DFM等必要资源,移除会导致窗体资源加载失败引发AV。
    2. 使用Resource Hacker等工具打开生成的EXE文件,查看RCDATA类型下的Image1资源,确认其对应的图片是否为最新版本,以此判断是资源未正确编译进EXE,还是加载逻辑的问题。
    3. 尝试手动加载资源的方式排查问题,替代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;
      
  • 其他排查方向

    1. 关闭Delphi IDE的增量编译功能:打开项目选项 -> 编译 -> 取消勾选“增量编译”,然后执行全量编译。
    2. 重启Delphi IDE,避免IDE缓存旧资源数据。
    3. 若使用版本控制工具,确认本地Img文件夹下的图片未被版本控制还原为旧版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:22:38