Tbitmaplistanimation.animationbitmap使用的可用内存异常引发EInvalid指针

时间:2017-01-04 13:57:53

标签: delphi firemonkey delphi-xe7

我面临的问题如下。请注意我不是delphi pascal的专业人士

为了节省大量内存和时间,我创建了一个程序:

procedure TForm1.Placeholder(tspath: STRING);
begin       //rgbholder :TImage globally declared (Dinamicly create image)
  rgbholder.Free;//Free previous image
  rgbholder := timage.Create(self);
  rgbholder.Width := 10;
  rgbholder.Height := 10;
  rgbholder.Visible := false;
  rgbholder.Bitmap.LoadFromFile(TSpath);
end;

procedure TForm1.Image3Click(Sender: TObject);
begin
  placeholder('Data\Grass\Grassanim1low.png');
  bitmaplistanimation5.Stop;
  bitmaplistanimation5.Loop := true;
  //bitmaplistanimation5.AnimationBitmap.LoadFromFile('Data\Grass\Grassanim1low.png'); 
  bitmaplistanimation5.AnimationBitmap.Assign( rgbholder.Bitmap);
  bitmaplistanimation5.AnimationCount := 22;
  bitmaplistanimation5.AnimationRowCount := 2;
  bitmaplistanimation5.Duration := 2.5;
  bitmaplistanimation5.PropertyName :='bitmap';
end;

现在我的问题是释放bitmaplistanimation5.AnimationBitmap.Assign(rgbholder.Bitmap);

的记忆

执行此代码时

bitmaplistanimation5.Stop;
bitmaplistanimation5.Enabled := false;
bitmaplistanimation5.AnimationBitmap.Free;

一切顺利,直到我用close;关闭可执行文件或者只是用窗口中的退出关闭它。

关闭后,它会在00007A55模块Project1.exe中抛出一个应用程序错误异常EInvalidPointer。指针操作无效

我不认为我正在尝试释放已经释放的内存,我也没有尝试释放除内存管理器之外的其他地方分配的内存,除非占位符过程很重要。除非我遗漏某些东西或不理解我应该做的事情。

1 个答案:

答案 0 :(得分:0)

作为一般规则,您只应在您创建的对象上调用Free。您没有创建此对象,TBitmapListAnimation控件创建了它。所以这段代码是你的一个明显错误:

bitmaplistanimation5.AnimationBitmap.Free;

你必须删除它。

我怀疑从FMX位图清除内存的正确方法是将位图的WidthHeight属性设置为0

我想知道你是否真的需要释放这段记忆。如果程序停止使用内存,并且系统内存不足,则可以将未使用的内存交换到磁盘。通常会发现那些对虚拟内存不了解的程序员,采取这样的行动没有任何好处。如果试图释放这段记忆,你实际上让你的节目表现更差而不是更好。我不会感到惊讶。