我使用 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 并保留控件?

最佳答案

TObjectList 有一个 OwnsObjects 属性,默认是 True 。如果您在释放它之前的某个时间不更改它,它将释放它包含的对象。如果您不想这样,请将 OwnsObjects 设置为 False

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

如果您不需要 TObjectList 拥有(清理)的对象,最好使用 TList 代替:
vHeaderLabelsList := TList<TLabel>.Create;

关于delphi - 为什么释放 TObjectList 也会删除控件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39302634/

10-09 07:28