我有一个从TFrame扩展的对象。它包含一个TCombobox。

我要确保在销毁框架时释放所有关联的对象。但是,当我的析构函数运行时,我可以访问组合框,但是其内容已被清除。

怎么办?如何访问析构函数中的项目?

我的析构函数看起来像这样;

destructor TfraImportAttachments.Destroy;
begin

  MessageDlg(IntToStr(cboCategory.Items.count), mtInformation, [mbOK], 0);
  FreeObjects(cboCategory.Items);

  inherited;
end;

最佳答案

DestroyHandle可能已在析构函数之前到达组合框。然后项目消失了,因为它们没有保存到TCustomComboBox.FSavedItemsTCustomComboBox.DestroyWnd列表中。

组合框Delphi对象仍然存在,但是实际的控件(通过窗口句柄访问的控件)已经消失了。通过访问ComboBox.Items,VCL重新创建实际控件,以便它可以检索项目,但是该新控件没有任何项目,因此Items.Count返回0。

一种解决方案是将项目放入组合框,然后将TObjectListTListTList<TObject>放入组合框,具体取决于您要对它们执行的操作。因此,所有权仍在“代码”列表中,而组合框中仍引用这些项目。

关于delphi - 为什么我的TStrings对象在我的析构函数有机会运行之前就被销毁了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13881482/

10-14 09:37