将TObjectList作为参数传递 - Delphi Xe2

时间:2013-09-02 13:26:15

标签: delphi delphi-xe2

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

作为样本:

Form1中:

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;

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

问题是:

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

谢谢!

3 个答案:

答案 0 :(得分:1)

Form2需要获取列表的所有权,不要让Form1释放它,否则循环遍历列表将内容复制到自己的本地列表。

答案 1 :(得分:0)

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

尝试TObjectList<TPerson>.Create(false);

答案 2 :(得分:0)

考虑到问题的确切表达方式,答案是“不可能”,因为 TObjectList&lt; T&gt; 是一个类,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 TForm2 的数据成员,声明为 TObjectList&lt; TPerson&gt; 提取方法从列表中删除项目而不释放它。因此,在提取后,该项目将被添加到内部列表中。因为它不在外部列表中,所以当列表出现时它不会被释放。