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

标签 delphi event-handling

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

ShowMessage('You clicked on ' + (Sender as TButton).Name);

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

有办法解决这个问题吗?

假设我有 Button1,其硬编码的 onclick 事件处理程序是:

ShowMessage('This is Button1');

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

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

注意:我正在寻找一种解决方案,允许我按原样使用 TButton 而无需继承它。

最佳答案

您可以在覆盖之前查找 OnClick 的分配,保留它并在新处理程序中使用它 - 基本上链接事件。

类似这样的事情:

  var original : TNotifyEvent;

  original := Component.OnClick;
  Component.OnClick := NewMethod;

然后在你的 NewMethod 中:

  if assigned(original) then original(Sender);

您可能不需要单个原始变量,而是保存在组件上键入的集合。

关于Delphi:如何动态分配事件处理程序而不覆盖现有的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501623/

相关文章:

Delphi 10 TImage,移动图像宽度

javascript - 如何检测(所有)鼠标点击?

javascript - Material UI Popover - keydown 事件模拟问题

ios - UITextField 文本更改事件

javascript - 如何获取所有 GlobalEventHandler 的列表?

delphi - 如果路径中有空格则 ShellExecute 失败

delphi - 重新声明隐藏基类中的成员

multithreading - Delphi线程锁等待字符串操作

delphi - 如何从对象自己的方法之一中释放对象?

perl - AnyEvent 计时器问题