Timage问题(50分)

  • 主题发起人 主题发起人 hhh
  • 开始时间 开始时间
H

hhh

Unregistered / Unconfirmed
GUEST, unregistred user!
请问Timage控件的loadfromfile()装入的图形是否需要释放内存空间?应如何释放?
 
这完全取决于你的TImage控件:
1、如果你的TImage是设计时直接放在窗体上的,那么你无须在意它的内存管理。
2、如果你的TImage是在程序中动态生成的,那么你在用完以后要将它释放。
用 img.free 就行了。
这与它是否调用loadfromfile无关。
 
Delphi建议使用TImage.Free更安全;
 
我想你的意思不是动态创建timage吧!不太明白你的意思!
 
我的意思是在同一个Timage控件,多次调入不同的图形时,前一幅图形是否需要
释放和如何释放
 
不需要释放!
 
不需要释放!
Delphi的源程序是这样写的:

procedure TGraphic.LoadFromFile(const Filename: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;

所以你无需关心Timage的内部实现,只需要关心TImage的创建与释放。
 
to柳五公子:
根据你的代码,不能确定是否需要是否TImage.
因为这里的代码没有在成功加载前释放TImage
的代码.要证明不需要释放,应再跟踪LoadFromStream(),
直到发现成功加载前释放TImage的代码.

BTW:据我用MemProof检查,TImage是可以自动释放
前面的资源的.在重复用一个TImage加载多个图象后
退出,仍不会发生资源和内存泄漏.
 
我也注意到这个问题,但我想在Delphi控件内部分配的内存,绝对无须我们在
外部释放它,--因为实际上这些控件都是黑匣子(里面的所有内存分配肯定是自生
自灭)否则我们用Delphi做的程序哪还有可靠性而言?!
 
谢谢各位的解答,但我在程序运行过程中,用Timage.picture.loadfromfile()连续
装入图形,显示了相当多的图形后,会出现下面这几个错误之一,然后程序便不能再
装入任何图形了,请问这是什么原因?
1.'stream write error'
2.'Access violation at adress xxxxxxxx.Write of adress xxxxxxxx'
3.'Canvas does not allow drawing'
 
hhh:
我做了一个实验测试了一下,不断的将BMP文件Load进入一个TImage控件,但
没有发现你说的问题,能把你的程序贴出来吗?
 
我用如下语句装入了1000次也没什么问题。
For i:=0 to 1000 do begin
Image1.Picture.LoadFromFile('c:/windows/clouds.bmp');
Caption:=IntToStr(i);
end;
我想你的问题应该是其它原因。你也可以用这样的小的程序试试,是否是你的系统上
的问题。
 
我的程序与menxin类似,不过每次装入的是不同的图形(大约800K)
 
这样也没遇到问题!
for i:=0 to 200 do begin
Image1.Picture.LoadFromFile('c:/windows/acdwal~1.bmp');
Image1.Picture.LoadFromFile('c:/windows/clouds.bmp');
Caption:=IntToStr(i);
end;
这不是image的问题,从别的方面想想吧。装入后加个延时试试。
 
你可以在你的机器上做个类似menxin的小试验,
如果没有问题,说明你程序的其他部分有误;
如果仍有问题,那么重装一遍Delphi吧.

或者把程序放到别的机器上编译试试,
总之如果不是动态生成的Timage,不会用到free的.
 
用个TImageList控件试试吧。
 
同意 lwlnic
好象 D3 的 IMAGE 有点BUG
 
hhh, 检查一下你的程序是否在某个地方释放了Image或它的owner或者parent.
 
你怎么样了,请快结束此问题.
 
menxin 的程序确实没有问题, 但改为

const
files: array[0..20] of String = (
'c:/windows/acdwal~1.bmp',
'c:/windows/clouds.bmp',
...);
begin
for i:=0 to 200 do begin
Image1.Picture.LoadFromFile(files);
Caption:=IntToStr(i); end;
end;

就有问题了, 原因未明, 我用的方法是:

const
files: array[0..20] of String = (
'c:/windows/acdwal~1.bmp',
'c:/windows/clouds.bmp',
...);
var
bmp: TBitmap;
begin
for i:=0 to 200 do
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile(files);
Image1.Picture.Bitmap.Assign(bmp);
Caption:=IntToStr(i);
finally
bmp.free;
end;
end;
end;

虽然慢了点, 但管用.
 
后退
顶部