我有一个从TFrame扩展的对象。这包含一个TCombobox。
我想确保在我的框架被销毁时释放任何相关对象。然而,当我的析构函数运行时,我可以访问组合框,但它的项目已被删除。
这会怎么做?如何访问析构函数中的项目?
我的析构函数看起来像这样;
destructor TfraImportAttachments.Destroy;
begin
MessageDlg(IntToStr(cboCategory.Items.count), mtInformation, [mbOK], 0);
FreeObjects(cboCategory.Items);
inherited;
end;
答案 0 :(得分:11)
在析构函数之前,DestroyHandle
可能已到达组合框。然后,项目已消失,因为它们未保存到TCustomComboBox.FSavedItems
中的TCustomComboBox.DestroyWnd
列表中。
组合框Delphi对象仍然存在,但实际控件(通过窗口句柄访问的控件)消失了。通过访问ComboBox.Items,VCL重新创建实际控件,以便它可以检索项目,但是新控件没有任何项目,因此Items.Count
返回0。
解决方案是将项目放入组合框和TObjectList
,TList
或TList<TObject>
,具体取决于您要对它们执行的操作。所以所有权在“代码”列表中,而项目仍在组合框中引用。