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

问题描述 投票:6回答:4

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

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

delphi destructor tframe
4个回答
8
投票

您说当调用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;

6
投票

您可以像这样利用TFrameWM_DESTROY处理程序:


3
投票

您的问题并不是真正有用,因为,一般而言,不建议在GUI控件中存储


0
投票

释放析构函数中的Combobox.Items.Objects为时已晚。因此,根据以前的答案,用这种方法更好,更安全:

© www.soinside.com 2019 - 2024. All rights reserved.