gpt4 book ai didi

delphi - TFrame 内的事件处理程序?

转载 作者:行者123 更新时间:2023-12-03 15:18:59 27 4
gpt4 key购买 nike

我有一个 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/

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