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
.如果在释放它之前没有在某个时候更改它,它将释放它包含的对象.如果你不想那样,那么设置OwnsObjects
为False
.
vHeaderLabelsList := TObjectList<TLabel>.Create(False);
Run Code Online (Sandbox Code Playgroud)
如果您不需要TObjectList拥有(清理)的对象,那么最好简单地使用TList:
vHeaderLabelsList := TList<TLabel>.Create;
Run Code Online (Sandbox Code Playgroud)
你偶然发现了TObjectList
和之间的区别TList<TObject>
.
一个TObjectList
"拥有"在列表中,这意味着,在默认情况下,当一个对象从列表中,或者当列表本身被破坏除去它会破坏其中含有的所有对象的对象.
如果您不希望发生这种情况,请在将项目添加到列表之前使用a TList<TObject>
或将其设置OwnsObjects
为false.
这通常在构造函数中完成,但您也可以在之后设置它.
所有这些都在文档中明确指出.
如果条目是拥有的,则从列表中删除条目对象时,将释放条目对象.
OwnsObjects属性获取或设置对象所有权.
你应该检查一下:http://docwiki.embarcadero.com当出现意想不到的事情然后急于SO :-).
归档时间: |
|
查看次数: |
221 次 |
最近记录: |