看似简单,却老是搞不定,苦恼!!!(200分)

  • 主题发起人 主题发起人 qlwy
  • 开始时间 开始时间
Q

qlwy

Unregistered / Unconfirmed
GUEST, unregistred user!
做一个关于视频的项目。
界面期望做成地图的样式,也就是界面背景是一个大的Image(BMP),然后将地图上各个位置
的摄像机做成图标一样的小图(BMP),各小图信息保存在数据库中,FormCreate时载入小图到
大地图上,并且小图可以增加、删除和修改。
问题:小图载入时,每条信息我把它保存在list里,
img:=timage.Create(self);
img.Parent:=panel1;
img.Picture.LoadFromFile (CurrentFile);
x:= .....; y:=......;(从数据库中取值)
img.SetBounds(x,y,img.Picture.Bitmap.Width,img.Picture.Bitmap.Height);
list1.add(@img);
然而,在删除地图上某个小图和释放内存时,都会出现
raised exception class eAccessViolation with message 'Access violation at
address 00E38DDC,Read of address FFFFFFFF' 这样的错误。
程序代码如下:
删除某个小图: img:=list1.items; img.Free;
释放所有的指针:(第一个循环可以,第二个循环就出错,而且发现虽然list1.count的
值是对的,但是所有元素的地址却都是一样的)
while list1.count>0 do
begin
Img:=PImage(list1.Items[0]);
list1.Delete(0);
img.free;
end;
list1.clear;
list1.free;

另外也请图像高手指点,当鼠标点中地图上的某个小图时,怎样给它一个焦点,让操作者
明白它已经点中了这个小图标。
 
1.释放的顺序和创建的顺序应该相反;
2.给选中图象画一个边框。

 
>>Img:=PImage(list1.Items[0]);
这里的List1.Items[0]有可能已被img:=list1.items; img.Free;释放掉,而制向一个
无效的地址。
>>img:=list1.items; img.Free;
故应改为:
img:=list1.items;
img.Free;
List1.Items:=nil;


具体要把你大代码帖出来,肯定是你Free一个不存在的对象。
不过你的代码确实有问题,看起来怪怪的。
while ....
改为
for i:=0 to FList1.Count-1 do不是更清晰吗?

>>当鼠标点中地图上的某个小图时,怎样给它一个焦点
给它画一个边框。
 
建议封装一个对象来完成添加和删除,这样即清晰又方便
 
谢谢各位指点。
我明白balaschen回答的意思,但是问题不是因为list里的img被释放的原因,即使我不对
这些小图进行任何操作,仅载入后就释放,也会出现同样问题;
另外我以前就是用for i:=0 to FList1.Count-1 do语句的,其结果是同样的错误。
现在我认为问题的关键是在
img:=timage.Create(self);
img.Parent:=panel1;
img.Picture.LoadFromFile (CurrentFile);
x:= .....; y:=......;(从数据库中取值)
img.SetBounds(x,y,img.Picture.Bitmap.Width,img.Picture.Bitmap.Height);
list1.add(@img);
这段语句上,用分步调试可以发现,每次img create时其地址都是相同的,也就是说list1
里的所有成员都具有相同的地址,这是我百思不得其解的地方。
 
我从未想到你会错在这个地方,我仔细看了看,你错在画蛇添足!
》》Img本身是一个指针变量,因此@Img存的值是Img本身,而不是指向timage.Create(self)
创建的对象!
把相应的代码改为:
var
Img:TImage;
begin
Img:=TImage.Create(self);
img.Parent:=panel1;
img.Picture.LoadFromFile (CurrentFile);
x:= .....; y:=......;(从数据库中取值)
img.SetBounds(x,y,img.Picture.Bitmap.Width,img.Picture.Bitmap.Height);
list1.add(img);
end;
---------------------------------------
删除某个小图: img:=list1.items; img.Free;
改为:
img:=List1;
img.Free;
List1:=nil;
---------------------------------------
最后的释放改为:
for i:=0 to FList.Count-1 do
begin
TImage(FList).Free;
end;
FList.Free;

如果还有问题的话,你可能要重装系统了:)
 
多人接受答案了。
 
后退
顶部