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

Delphi加载多个TImage触发Access Violation问题求助

问题分析与解决方案

错误原因

你的代码触发Access Violation的核心问题是:创建TImage对象后立刻调用了img[I].Free释放了该对象,但后续又试图访问已经失效的对象内存(调用Picture.LoadFromFile)。此时img[I]指向的内存已经被系统回收,直接访问必然触发内存违规错误。

修复后的代码

移除img[I].Free即可解决问题——因为你创建TImage时指定了panels[I]作为Owner,组件的生命周期会由其父容器自动管理(面板销毁时会同步释放内部的TImage),不需要手动调用Free:

Public
  img: array of TImage;

...

SetLength(img, 50);

for I := 0 to 50 - 1 do
begin
  img[I] := TImage.Create(panels[I]); // 以panel为Owner,自动管理对象生命周期
  img[I].Parent := panels[I];
  img[I].Width := 80;
  img[I].Height := 80;
  img[I].Left := 0;
  img[I].Top := 0;
  img[I].Stretch := True;
  // 移除img[I].Free,避免提前释放对象
  img[I].Picture.LoadFromFile('./img1.bmp');
end;

后续从URL加载图片的实现思路

如果要实现从URL加载图片到多个TImage,可以借助Delphi自带的Indy组件库完成网络请求,示例逻辑如下:

var
  HTTP: TIdHTTP;
  ImageStream: TMemoryStream;
begin
  HTTP := TIdHTTP.Create(nil);
  ImageStream := TMemoryStream.Create;
  try
    // 下载图片到内存流
    HTTP.Get('目标图片URL', ImageStream);
    ImageStream.Position := 0; // 重置流指针到起始位置
    // 加载到TImage
    img[I].Picture.LoadFromStream(ImageStream);
  except
    // 捕获网络请求异常,比如URL不可达、网络中断等
    on E: Exception do
      ShowMessage('图片加载失败:' + E.Message);
  finally
    // 释放资源
    ImageStream.Free;
    HTTP.Free;
  end;
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:51:15