Delphi:如何在不覆盖现有事件处理程序的情况下动态分配事件处理程序?

LaB*_*cca 11 delphi event-handling

我需要遍历组件并分配一个事件处理程序(例如,为所有TButton动态分配OnClick事件

ShowMessage('You clicked on ' + (Sender as TButton).Name);
Run Code Online (Sandbox Code Playgroud)

问题是在某些情况下我已经分配了TButton OnClick事件.

有办法解决问题吗?

让我们想象一下,我有一个Button1,其中的harcoded onclick事件处理程序是:

ShowMessage('This is Button1');
Run Code Online (Sandbox Code Playgroud)

在我的"解析"后,我希望Button1的完整事件处理程序变为:

ShowMessage('This is Button1'); // design time event handler code
ShowMessage('You clicked on ' + (Sender as TButton).Name); // runtime added
Run Code Online (Sandbox Code Playgroud)

注意:我正在寻找一种允许我使用TButton而不继承它的解决方案.

Joh*_*kup 16

您可以在覆盖它之前查找OnClick的任务,坚持使用它并在新的处理程序中使用它 - 基本上链接事件.

像这样的东西:

  var original : TNotifyEvent;

  original := Component.OnClick;
  Component.OnClick := NewMethod;
Run Code Online (Sandbox Code Playgroud)

然后在你的NewMethod中:

  if assigned(original) then original(Sender);
Run Code Online (Sandbox Code Playgroud)

你可能不想要一个原始变量,而是拥有一个键入组件的集合.