1

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

4

1 回答 1

7

您需要让组件声明一个字段来存储表单的原始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演员将这个组件与表单拥有联系在一起,但如果你想要更多的灵活性,你可以轻松地满足这一点。

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

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

不希望有一个组件干预它的拥有形式。绝大多数组件应该是自包含的实体,改变组件所有者会破坏 Delphi 组件的预期合同。

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

如果您确实走上了拥有通用基本表单的路线,那么您应该覆盖DoClose而不是使用该OnClose事件。DoXXX在创建公共基类或组件时,始终使用事件引发器而不是事件本身。

于 2012-04-07T06:39:53.033 回答