- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 TForm
(TVehicleEditForm),里面有 3 个相同的 TFrame
(TVehicleUnitFrame)。
这个想法是框架的每个实例都通过框架内的事件处理程序
处理自己的事件。问题是未调用 eventhandler
。
我尝试通过重写 Create 方法,通过框架内的代码分配 eventhandler
,但在这种情况下也不会调用处理程序。
但是如果我从表单中将eventhandler
分配到框架之外,它就可以正常工作。像这样:
fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;
而且这仅适用于一个按钮!由于我在框架内有很多组件,这会导致很多分配......当这应该直接在对象检查器中完成时,代码相当丑陋。
我使用的是D2007。知道原因吗?
问候罗兰
最佳答案
当您从代码中执行此操作时,它起作用的原因是您替换了指向事件处理程序的指针,无论之前有什么。
在设计时,我有两个可能的位置来设置处理程序。假设我在 Unit1 中有 Frame1 并将其放置在 MyUnit 中的 MyForm 上,我将有机会在这两个位置设置事件处理程序。
在您的情况下,您希望在框架本身中设置事件处理程序(在我的示例中为 Unit1),因为它引用的代码位于框架本身上。如果你这样做,它应该有效。如果您在使用事件处理程序的地方(MyUnit)设置事件处理程序,那么事件处理程序将被分配在那里。
Delphi 足够聪明,只要在您在表单中添加事件处理程序之前分配了该事件处理程序,它仍然可以从您的框架调用该事件处理程序。如果您首先将其添加到表单上,然后将处理程序添加到框架上,则框架上的最后一个处理程序将不会被调用。更糟糕的是,如果您删除表单中的处理程序,它仍然不会调用框架上的处理程序。
您需要做的是:
右键单击您的表单并选择“以文本形式查看”。向下滚动到框架。它应该是这样的:
inline FrameX: fraVehicleUnitFrame1
在其下面,寻找
inherited cmdNewOwner: TButton
在那里你应该看到类似的东西:
OnClick = FormOldClickHandler
或者也许
OnClick = nil
删除此 OnClick 分配,再次以表单形式查看并保存。一切都应该很好。如果您现在选择表单上的按钮(或任何 cmdNewOwner ),对象检查器应该在该事件旁边不显示任何内容。
关于delphi - TFrame 内的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109574/
为了避免单例和全局变量,我希望能够将参数传递给 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
我是一名优秀的程序员,十分优秀!