我面临的问题如下。请注意我不是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。指针操作无效
我不认为我正在尝试释放已经释放的内存,我也没有尝试释放除内存管理器之外的其他地方分配的内存,除非占位符过程很重要。除非我遗漏某些东西或不理解我应该做的事情。
答案 0 :(得分:0)
作为一般规则,您只应在您创建的对象上调用Free
。您没有创建此对象,TBitmapListAnimation
控件创建了它。所以这段代码是你的一个明显错误:
bitmaplistanimation5.AnimationBitmap.Free;
你必须删除它。
我怀疑从FMX位图清除内存的正确方法是将位图的Width
和Height
属性设置为0
。
我想知道你是否真的需要释放这段记忆。如果程序停止使用内存,并且系统内存不足,则可以将未使用的内存交换到磁盘。通常会发现那些对虚拟内存不了解的程序员,采取这样的行动没有任何好处。如果试图释放这段记忆,你实际上让你的节目表现更差而不是更好。我不会感到惊讶。