我有一个“表单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”而不是参考?
谢谢!
答案 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; 。 提取方法从列表中删除项目而不释放它。因此,在提取后,该项目将被添加到内部列表中。因为它不在外部列表中,所以当列表出现时它不会被释放。