在 Delphi 中加载多个Timage时发生访问冲突

abithluo  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(200)

当我试图加载图像时,我遇到了访问冲突。当我试图从文件加载时,错误发生了。有什么方法可以解决这个问题吗?
下面是代码:

Public
  img: array of TImage;

...

SetLength(img, 50);

for I := 0 to 50 - 1 do
begin
  img[I] := TImage.Create(panels[I]);
  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;

我想创建不同的图片,我从一个网址获得多个图像。但我需要得到一个图像首先工作。

pgvzfuti

pgvzfuti1#

您正在构造图像对象并将其添加到列表中,但随后您调用了img[I].Free,这会破坏该图像对象。当您在下一行尝试加载它时,您将使用无效的对象,这就是您的应用程序崩溃的原因。
把那条线拿掉。
您正在构造具有所有者control-panel的TImage控件-该面板作为其所有者将在面板本身被销毁时自动清除这些图像控件,因此您不必担心内存泄漏。
然而,如果出于某种原因,你想清除和删除你存储在数组中的图像,你将不得不循环通过数组,然后调用img[I].Free.当然,在你这样做之后,你不应该访问那些图像.通常在这种情况下,你应该设置图像引用到nil.要通知其他代码数组中没有有效的图像,另一种方法是将数组长度设置为0。

for I := 0 to 50 - 1 do
  begin
    img[I].Free;
    img[I] := nil;
  end;

for I := 0 to 50 - 1 do
  begin
    img[I].Free;
  end;    
SetLength(img, 0);

相关问题