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

时间:2012-04-07 06:20:53

标签: delphi components delphi-5

我正在研究放置在我项目的每个形式上的组件。在运行时,是否可以让组件在其所有者表单的OnClose事件处理程序中包含代码。换句话说,表单将触发它自己的OnClose事件处理程序,但该组件还将包含在所有者表单的OnClose事件上运行的其他事件处理程序代码。 (那是什么叫做矢量替换?) 谢谢。

1 个答案:

答案 0 :(得分: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事件提升者而不是事件本身。