gpt4 book ai didi

delphi - 组件可以用它自己的处理程序替换它的所有者表单的事件(OnClose)吗?

转载 作者:行者123 更新时间:2023-12-03 19:04:47 26 4
gpt4 key购买 nike

我正在研究一个放置在我项目的每种形式上的组件。是否可以在运行时让组件将代码包含到其所有者表单的 OnClose 事件处理程序中。换句话说,表单将触发它自己的 OnClose 事件处理程序,但组件还将包含额外的事件处理程序代码以在所有者表单的 OnClose 事件上运行。 (这就是所谓的向量替换吗?)
谢谢你。

最佳答案

你需要让组件声明一个字段来存储表单的原始OnClose .然后您可以在组件的构造函数中执行以下操作:

FOriginalFormClose := (Owner as TForm).OnClose;
(Owner as TForm).OnClose := FormClose;

然后组件的 FormClose会读:
TMyComponent.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// do stuff for this component
if Assigned(FOriginalFormClose) then
FOriginalFormClose(Sender, Action);
end;

自然是 as cast 将此组件与表单拥有联系在一起,但如果您想要更大的灵 active ,您可以轻松满足这一点。

这是对您提出的问题的直接回答,但如果不质疑您的整体设计,那将是我的失职。如果您希望组件存在于应用程序的每个表单上,那么您当然应该派生 TForm 的子类。包含您的自定义设置。然后让您的应用程序中的每个表单都基于该通用基表单类。

这种方法还有许多其他好处。例如,@LachlanG 添加了以下非常恰当的评论,我完全同意:

Having a component meddle with it's owning form is undesirable. The vast majority of components should be self contained entities, altering the component owner breaks the expected contract of a Delphi component.



通用基本表单方法通过将与表单一起使用的代码放置在表单中来解决这个问题。

如果您确实要采用通用基本形式,那么您应该覆盖 DoClose而不是使用 OnClose事件。始终使用 DoXXX创建公共(public)基类或组件时,事件引发者而不是事件本身。

关于delphi - 组件可以用它自己的处理程序替换它的所有者表单的事件(OnClose)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052290/

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