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
相关产品推荐
相关产品推荐

