【发布时间】:2013-08-27 02:54:09
【问题描述】:
我正在使用 Delphi XE2。我构建了一个自定义 TComboBox,以便我可以轻松添加键/字符串对并在组件的析构函数中处理清理。
全部 if not (csDesigning in ComponentState) 为简洁起见省略代码。
interface
type
TKeyRec = class(TObject)
Key: string;
Value: string;
end;
TMyComboBox = class(TComboBox)
public
destructor Destroy; override;
procedure AddItemPair(const Key, Value: string);
end;
implementation
destructor TMyComboBox.Destroy;
var i: Integer;
begin
for i := 0 to Self.Items.Count - 1 do
Self.Items.Objects[i].Free;
Self.Clear;
inherited;
end;
procedure TMyComboBox.AddItemPair(const Key, Value: string);
var rec: TKeyRec;
begin
rec := TKeyRec.Create;
rec.Key := Key;
rec.Value := Value;
Self.Items.AddObject(Value, rec);
end;
当应用程序关闭时,析构函数被调用,但Items.Count 属性不可访问,因为TComboBox 必须有父控件才能访问此属性。在调用析构函数时,它不再有父控件。
我以前见过这个问题,不得不将对象存储在单独的TList 中并单独释放它们。但这仅起作用,因为我将它们添加到TList 的顺序始终与添加到组合框中的字符串相同。当用户选择一个字符串时,我可以使用组合框索引在TList 中查找相关对象。如果组合框已排序,则索引将不匹配,因此我不能总是使用该解决方案。
还有其他人看过吗?你是如何解决这个问题的?能够在组件的析构函数中释放对象真是太好了!
【问题讨论】:
-
是的。 this one 也有同样的问题。 ComboBox 将它的项目与本机控件一起保存,当它的父/所有者销毁自身时,它早已不复存在。
-
您是否尝试过使用 BeforeDestruction (docwiki.embarcadero.com/Libraries/XE2/en/…) 代替?
-
@GerryColl - 很好地考虑了使用 BeforeDestruction。但是,同样的问题仍然存在......
-
你不应该在清理完你的东西后至少调用继承的析构函数吗?我认为这不会解决您的问题,但是必须这样做。
-
@alzaimar - 是的,我正在这样做。我只是忘了在这里添加它。谢谢!
标签: delphi delphi-xe2 destructor