我有一个包含TFrame
的表格。 TFrame
包含动态填充的ComboBox
。每个ComboBox
条目都有一个关联的对象。到TFrame
的重写析构函数被调用时,ComboBox
中的项目已被清除,而没有释放其关联的对象。无论我将ComboBox
放在设计器视图中的窗体上,还是在代码中以nil或TFrame
作为其所有者动态创建它,都会发生这种情况。我目前使用包含OnDestroy
的TForm
事件来调用包含TFrame
的清理过程。
是否有更好的方法,不需要TFrame
的容器进行显式的过程调用?理想情况下,应该释放在动态位置添加到ComboBox
的对象?
您说当调用TFrame的析构函数时,ComboBox的项目已被清除。事实并非如此,ComboBox项永远不会清除。当Item被ComboBox销毁时,它们的计数仅为0。
退出应用程序,并且VCL破坏包含框架和ComboBox的表单时,操作系统也会破坏本机ComboBox控件,因为它放置在要破坏的窗口中。当您以后访问这些项目以释放帧析构函数中的对象时,VCL必须重新创建一个本机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;
您可以像这样利用TFrame
的WM_DESTROY
处理程序:
您的问题并不是真正有用,因为,一般而言,不建议在GUI控件中存储
释放析构函数中的Combobox.Items.Objects为时已晚。因此,根据以前的答案,用这种方法更好,更安全: