3

我使用 TObjectList 来处理特定的标签列表。但是当我在 Try Final 中执行推荐的 .Free 时,它​​也会从列表中删除控件。

带有 3 个标签的简单示例:

Procedure GetHeaderLabels(var aList:TObjectList<TLabel>);
begin
  aList.Add(Form1.lblHeaderCars);
  aList.Add(Form1.lblHeaderBrands);
  aList.Add(Form1.lblHeaderModels);
end;

procedure TForm1.Button1Click(Sender: TObject);
var vHeaderLabelsList:TObjectList<TLabel>;
begin
  vHeaderLabelsList:=TObjectList<TLabel>.Create;
  try
     GetHeaderLabels(vHeaderLabelsList);
      {... process Header Labels }
  finally
    vHeaderLabelsList.Free;
  end;
end;

在这种情况下,当我执行此代码时,我最终会丢失标签控件-它们已从表单中删除,并且在调试中我看到控件为零。

我不应该 .Free TObjectList 吗?我怎样才能释放 TObjectlist 并仍然保留控件?

4

2 回答 2

10

TObjectList有一个OwnsObjects属性,默认情况下是True. 如果您在释放它之前不更改它,它将释放它包含的对象。如果你不想这样,那么设置OwnsObjectsFalse.

vHeaderLabelsList := TObjectList<TLabel>.Create(False);

如果您不需要 TObjectList 拥有(清理)的对象,最好简单地使用 TList 代替:

vHeaderLabelsList := TList<TLabel>.Create;
于 2016-09-03T02:20:50.303 回答
9

TObjectList您偶然发现和之间的区别TList<TObject>

TObjectList拥有”列表中的对象,这意味着默认情况下,当从列表中删除对象或列表本身被销毁时,它将销毁其中包含的所有对象。
如果您不希望发生这种情况,请在将项目添加到列表之前使用 aTList<TObject>或将其设置为 false。 这通常在构造函数中完成,但您也可以在之后设置它。OwnsObjects

所有这些都在文档中明确指出。

如果条目被拥有,当条目对象从列表中移除时,条目对象被释放。

OwnsObjects 属性获取或设置对象所有权。

你真的应该检查一下:http ://docwiki.embarcadero.com ,当发生意外情况时,你会冲到 SO :-)。

于 2016-09-03T02:22:48.843 回答