【问题标题】:Why does freeing TObjectList also deletes controls?为什么释放 TObjectList 也会删除控件?
【发布时间】:2017-01-11 04:10:41
【问题描述】:

我使用 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;

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

我不应该 .Free TObjectList 吗?如何释放 TObjectlist 并保留控件?

【问题讨论】:

    标签: delphi delphi-10.1-berlin tobjectlist


    【解决方案1】:

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

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

    如果您不需要 TObjectList 拥有(清理)的对象,最好直接使用 TList:

    vHeaderLabelsList := TList<TLabel>.Create;
    

    【讨论】:

    • 不,我只需要它们的列表,以避免为每个标签复制相同的代码。
    【解决方案2】:

    您偶然发现了TObjectList 和TList&lt;TObject&gt; 之间的区别。

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

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

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

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

    您真的应该检查一下:http://docwiki.embarcadero.com,如果发生意外情况,然后再冲到 SO :-)。

    【讨论】:

    • 请注意,还有一个非通用版本的TObjectList 也有一个OwnsObjects 属性。而TStringList 的Objects[] 属性中的条目也有一个OwnsObjects 属性。
    • 我阅读了文档,但只是看到 ot 应该完成这项工作。显然我应该进一步阅读。
    • 然而值得注意的是,TObjectList 的文档标识了这个 capability,但没有说明它是否默认启用,只是一个 ctor 参数将其打开或关闭.如所写,文档没有理由认为这是 default 行为(除非您专门并单独检查 Create 构造函数引用并发现提到的参数为 TRUE,如果未指定)。相比之下,Contnrs.TObjectList 文档 清楚地表明这是默认行为。 FM 为 FU 时,“RTFM”失败。 :)
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2011-10-28
    • 1970-01-01
    • 2012-01-17
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多