1

我有一个“Form 1”,它通过参数将对象列表发送到“Form 2”。但是 Delphi 将列表作为参考发送,所以如果我关闭释放列表中的“Form 1”错误发生在“Form 2”中

作为样本:

表格1:

var list: TObjectList<TPerson>;
    begin

      list  :=  TObjectList<TPerson>.Create();

      Try

      list.Add(TPerson.Create('JOHN', 29));
      list.Add(TPerson.Create('MARK', 27));

      Form2.getList(list);


      Finally
       FreeAndNil(list);
      End;

问题是在“Form 1”中释放列表后,引用指向一个已释放的对象。

问题是:

如何将列表作为副本而不是参考发送到“表格 2”?

谢谢!

4

3 回答 3

1

Form2 将需要获得列表的所有权并且不让 Form1 释放它,或者循环遍历列表,将内容复制到它自己的本地列表中。

于 2013-09-02T17:21:47.957 回答
0

考虑到问题的确切表述方式,答案是“不可能的”,因为TObjectList<T>是一个类,而 Delphi 中的类是引用类型。

实际上,传递给Form2.getList()方法的是一个值,但该值是一个引用,因此它的工作方式非常类似于通过引用传递值。

如果您需要列表的副本,则必须自己做,但是,变量列表具有对拥有项目的列表的引用,因此即使您在Form2中创建第二个列表并简单地添加现有的项目在作为参数接收的列表中,当列表在Form1中销毁时,项目将继续被销毁。

在您的位置,我将实现我的Form2.getList将项目从Form1中的列表移动到Form2中的列表。像这样的东西:

procedure TForm2.getList(aPeople: TObjectList<TPerson>);
begin
  while aPeople.Count>0 do
    FPeople.Add(aPeople.Extract(aPeople[0]));
end;

在此代码中, FPeople是声明为TObjectList<TPerson>的TForm2的数据成员。Extract方法从列表中删除一个项目而不释放它。因此,在提取后,该项目将被添加到内部列表中。因为它不再在外部列表中,所以当列表存在时它不会被释放。

于 2013-09-03T17:45:42.367 回答
0

检查 的所有权Tobjectlist,如果您释放列表并且列表拥有对象,则在释放列表时它将释放列表中的对象。

试试TObjectList<TPerson>.Create(false)

于 2013-09-03T12:25:03.483 回答