- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含 TFrame
的表单。 TFrame
包含一个动态填充的ComboBox
。每个ComboBox
条目都有一个关联的对象。当调用 TFrame
的重写析构函数时,ComboBox
中的项目已被清除,但未释放其关联对象。无论我将 ComboBox
放在设计器 View 中的表单上,还是在代码中以 nil 或 TFrame
作为其所有者动态创建它,都会发生这种情况。我目前使用包含的 TForm
的 OnDestroy
事件来调用包含的 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/
为了避免单例和全局变量,我希望能够将参数传递给 TFrame 组件。然而,由于 TFrame 通常在设计时包含在表单中,因此只能使用默认构造函数。 创建 TFrame 后,父窗体当然可以在 OnCre
我有一个 TForm (TVehicleEditForm),里面有 3 个相同的 TFrame (TVehicleUnitFrame)。 这个想法是框架的每个实例都通过框架内的事件处理程序处理自己的事
是否可以创建运行时框架并添加现有面板,例如将面板的父级设置为框架?添加后,复制框架并使用它? 喜欢: f:= Tframe. create(..) ... panel3.parent = f; //w
我正在使用 C++ Builder 创建 VCL 表单应用程序。现在我有一个包含一堆组件的 TFrame,它看起来像这样...... 我还有一个名为“添加”的按钮。基本上每次我按下窗体上的那个添加按钮
我很难让 Delphi 2006 将事件处理程序分配给 TFrame 上独立的组件。 假设我有一个框架TComboFrame包含 TCombo Combo1我在我的主要表单的几个地方使用它。 当我放置
我使用以下代码创建了一个以 TFrame 作为祖先的组件: type TCHAdvFrame = class(TFrame) private { Private declaration
如何在主 TForm 上创建(当我想显示它时)和销毁(当我想隐藏它时)框架?框架的align = alClient。 我尝试过这个: 形式: unit main; interface uses W
我有一个包含 TFrame 的表单。 TFrame 包含一个动态填充的ComboBox。每个ComboBox 条目都有一个关联的对象。当调用 TFrame 的重写析构函数时,ComboBox 中的项目
我有一个包含很多框架的项目,当我重新加载项目时,它们的宽度和高度会调整为 443x270 或左右。 我确实在运行时驻留这些框架,但我希望它们在设计时创建它们时保留下来。 我使用非嵌入式、经典的未停靠
我想制作一个基于 TFrame 的组件,其中包含 TLMDShapeControl (用于绘制圆角背景)和 TEdit 控件(可以也可以是 TComboBox 或 TDBEdit 等等)。之后,我将使
我创建了一个新框架,我想将其注册为组件。我已经从 this question 了解了 RegisterSprigType ,所以它省去了我一些麻烦。 RegisterSprigType 可以正确防止设
Delphi 对象检查器按设计不显示 TFrame 后代的附加属性。人们倾向于建议使用一种已知的技巧,该技巧通常用于在对象检查器上显示 TForm 后代的属性。技巧是:通过设计时包将 TForm 后代
我已将 TFrame 的后代类注册为组件,并且我注意到 Loaded 过程执行了两次: 运行时: TMyFrame = class(TFrame) private protected
我需要intercept the WM_PASTE message对于放置在 TFrame 的后代类中的 TEdit 组件。 如果不满足条件,我想启动粘贴操作。 有没有办法在帧级别做到这一点? (我的
我有一个带有嵌入式 TFrame 的表单,以及一些具有关联属性的组件(在父表单和框架中)。我可以使用以下方法访问父表单组件属性: for field in ctx.GetType(frm.ClassI
首先,简单介绍一下我,我是 GUI 编程的新手,尤其是 C++ Builder。我有一个包含一行单元格的 tframe,就像上图一样。有一个 + 按钮,当按下时,一个单元格只会添加到最后一列,如图所示
我创建了一个带有视觉和数据库控件的 Tframe 单元。我使用 sprig 方法将框架注册为组件。 TFrame 有一些已发布的 bool 属性。 一切正常,除了我注意到如果我启动 IDE 并打开一个
我有一个疑问。我在 firemonkey 中创建了一个框架并添加了 2 个按钮,然后在 MainForm 中添加了这个框架。 Frame.Align = Scale 在MainForm中对象Frame
我在 Delphi 7 中遇到框架和继承问题。 假设我使用 visible=false 定义一个框架(在设计时)。现在,我将此框架嵌入到某个表单中,并在表单内的框架的嵌入实例上设置 visible=t
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是一名优秀的程序员,十分优秀!