如何在TObjectList中持久保有对象(100分)

  • 主题发起人 主题发起人 yap
  • 开始时间 开始时间
Y

yap

Unregistered / Unconfirmed
GUEST, unregistred user!
请先看下面这段代码
TMyObject = class
private
ID: Integer;
Name: string;
public
procedure SetID(Value: Integer);
procedure SetName(Value: string);
……
end;

procedure …
var
MyObject: TMyObject;
begin
MyObject:=TMyObject.Create;

MyObjectList.Add(MyObject)
//MyObjectList:TObjectList;是一个全局变量。

MyObject.Free;
end;

当我在其他地方调用MyObjectList时,出错。察看VCL源代码发现TObjectList
其实保有的是MyObject的类指针。MyObject过早的释放导致了引用错误。
我知道只要把MyObject声明为全局变量就可以解决这样的问题,但这大概
不是一个好的办法。我有很多个这样的不同实例要加到MyObjectList中,不知道
各位大虾是如何较好得解决这问题的。
 
最后在释放
 
你的ObjectList加个remove方法,在需要的时候再删除对象并释放这个对象
并在最后全部remove所有对象

-----
http://www.8421.org
 
MyObject.Free;你已經free,當然用不了.
不需要全局的MyObject.
你只要刪除MyObject.Free一行就可.
 
perhaps you should override the add method,which new an object and assign for the
source like this:
function add(AItem:TObject) :integer
var ANewItem :TObject
begin
ANewItem := AItem.ClassType.Create
// your class must have the default constructor
ANewItem.Assign(AItem)
/// copy the source object
result := add(ANewItem)

end
 
MyObjectList:TObjectList虽然是全局变量,但是你刚刚CREATE的实例有马上被你FREE掉了,空壳子来空壳子去,用的时候当然会出错了,MyObject的FREE应该在删除ObjectLis的时候,而且必须逐个删除
 
把以上的看一遍就是了。
你的TObjectList只是保存了它的指针,既然指针指向的对象已经free掉了你自然就不能访问了。
darkiss的方法不错,不过还得再override delete或free函数。在删除或释放TList时释放里面的对象.
 
真没想到,这么快就有人回答了。
〉darkiss:我试一下,你提供了一个很好的思路。一定给分。
〉sonie:也很谢谢你的提示。
 
我刚式了一下,发现TObject类是没有Assign方法的,在Delphi里有没有
通用的对类的值拷贝方法?有的话就可以解决这个问题了。
 
当然有了,论坛里的答案多的是。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=706176
 
后退
顶部