gpt4 book ai didi

delphi - 在哪里释放动态分配的 TFrame 组件对象?

转载 作者:行者123 更新时间:2023-12-03 14:56:18 25 4
gpt4 key购买 nike

我有一个包含 TFrame 的表单。 TFrame 包含一个动态填充的ComboBox。每个ComboBox 条目都有一个关联的对象。当调用 TFrame 的重写析构函数时,ComboBox 中的项目已被清除,但未释放其关联对象。无论我将 ComboBox 放在设计器 View 中的表单上,还是在代码中以 nil 或 TFrame 作为其所有者动态创建它,都会发生这种情况。我目前使用包含的 TFormOnDestroy 事件来调用包含的 TFrame 的清理过程。

是否有更好的方法不需要 TFrame 容器进行显式过程调用?理想情况下,动态添加到 ComboBox 的对象应该在哪里释放?

最佳答案

你说当调用TFrame的析构函数时,ComboBox的项目已经被清除。事实并非如此,ComboBox 项目永远不会被清除。当 Items 被 ComboBox 销毁时,它们的计数仅为 0。

当您退出应用程序并且 VCL 销毁包含框架和 ComboBox 的表单时, native ComboBox 控件也会被操作系统销毁,因为它被放置在正在销毁的窗口中。当您稍后访问这些项目以便能够在帧析构函数中释放对象时,VCL 必须重新创建一个 native ComboBox 控件,其项目计数为 0。

我提出的解决方案很简单。不要将框架释放给框架,而是在表单的 OnDestroy 事件中销毁框架。那将是在表单的底层窗口被销毁之前,因此您将能够访问您的对象。

表格单位

procedure TMyForm.FormDestroy(Sender: TObject);
begin
MyFrame.Free;
end;

框架单元

destructor TMyFrame.Destroy;
var
i: Integer;
begin
for i := 0 to ComboBox1.Items.Count - 1 do
ComboBox1.Items.Objects[i].Free;
inherited;
end;

关于delphi - 在哪里释放动态分配的 TFrame 组件对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15043297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com