为什么释放TObjectList也会删除控件?

Mat*_*mtj 3 delphi tobjectlist delphi-10.1-berlin

我使用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;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当我执行此代码时,我最终缺少标签控件 - 它们从表单中删除,在调试中我看到控件是零.

我不应该.Free TObjectList?我如何免费使用TObjectlist并保持控件?

Ken*_*ite 10

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

vHeaderLabelsList := TObjectList<TLabel>.Create(False);
Run Code Online (Sandbox Code Playgroud)

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

vHeaderLabelsList := TList<TLabel>.Create;
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 9

你偶然发现了TObjectList和之间的区别TList<TObject>.

一个TObjectList"拥有"在列表中,这意味着,在默认情况下,当一个对象从列表中,或者当列表本身被破坏除去它会破坏其中含有的所有对象的对象.
如果您不希望发生这种情况,请在将项目添加到列表之前使用a TList<TObject>或将其设置OwnsObjects为false.
这通常在构造函数中完成,但您也可以在之后设置它.

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

如果条目是拥有的,则从列表中删除条目对象时,将释放条目对象.

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

你应该检查一下:http://docwiki.embarcadero.com当出现意想不到的事情然后急于SO :-).

  • 请注意,还有一个非通用版本的`TObjectList`,它也有一个'OwnsObjects`属性.并且`TStringList`在其`Objects []`属性中的条目也有一个`OwnsObjects`属性. (3认同)