问题标签 [event-handling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1657 浏览

c# - 用于事件处理程序的 Lambda?

C# 3 中的 Lambda 语法使得创建单行匿名方法非常方便。它们是对 C# 2 给我们的冗长的匿名委托语法的明确改进。然而,lambda 的便利性带来了在我们不一定需要它们提供的函数式编程语义的地方使用它们的诱惑。

例如,我经常发现我的事件处理程序是(或至少一开始是)简单的单行程序,它们设置状态值,或调用另一个函数,或在另一个对象上设置属性等。对于这些,我应该混乱我的类还有另一个简单的函数,还是我应该在我的构造函数中将一个 lambda 填充到事件中?

在这种情况下,lambda 有一些明显的缺点:

  • 我不能直接调用我的事件处理程序;它只能由事件触发。当然,对于这些简单的事件处理程序,我几乎不需要直接调用它们
  • 我无法从事件中解开我的处理程序。另一方面,我很少需要解开事件处理程序,所以这不是什么大问题,无论如何

出于上述原因,这两件事并不困扰我。而且我可以通过将 lambda 存储在成员委托中来解决这两个问题,如果它们确实是问题的话,但这会破坏使用 lambda 来方便和保持类整洁的目的。

不过,还有两件事我认为可能不是那么明显,但可能更成问题。

  • 每个 lambda 函数在其包含范围内形成一个闭包。这可能意味着在构造函数中较早创建的临时对象的存活时间比它们需要的时间长得多,因为闭包维护了对它们的引用。现在希望编译器足够聪明,可以从闭包中排除 lambda 不使用的对象,但我不确定。有人知道吗?

    再次幸运的是,这并不总是一个问题,因为我不经常在我的构造函数中创建临时对象。不过,我可以想象一个我做过的场景,而且我不能轻易地将它的范围限定在 lambda 之外。

  • 可维护性可能会受到影响。重要时刻。如果我将一些事件处理程序定义为函数,而将一些事件处理程序定义为 lambda,我担心这可能会使追踪错误或仅仅理解类变得更加困难。后来,如果我的事件处理程序最终扩展,我要么必须将它们移动到类级函数,要么处理我的构造函数现在包含大量实现我的类功能的代码的事实.

所以我想借鉴其他人的建议和经验,也许是那些有其他语言经验并具有函数式编程特性的人。这种事情有什么既定的最佳实践吗?您是否会避免在事件处理程序中或在 lambda 明显超出其封闭范围的其他情况下使用 lambda?如果不是,您会在多大的阈值下决定使用实函数而不是 lambda?上述任何陷阱有没有严重伤害任何人?有没有我没有想到的陷阱?

0 投票
6 回答
3947 浏览

c++ - Borland C++ Builder 5 - 通过 Escape 键取消不起作用

我在 Borland C++ Builder 5 中的一个对话框上的 Escape 键处理程序有一个相当令人困惑的问题。Escape 键是否有任何其他要求来触发取消事件(除了我在下面列出的那些)?

  1. “取消”按钮(一个 TBitBtn)的 Cancel 属性设置为 true。
  2. “取消”按钮的默认属性设置为 false。
  3. “取消”按钮的 modalResult 设置为 mrCancel。

注意:我正在使用仍在 Borland C++ Builder 5 中编译的旧遗留应用程序。我们有一个单独的项目来替换它 - 我只是在进行生命周期结束维护。

更新

四个月后,我终于不再摸不着头脑了……事实证明,应用程序的父窗体定义了一个运行时 OnShortCut 处理程序。我只需要禁用 Esc 处理程序就可以在子对话框上工作。

0 投票
4 回答
1958 浏览

java - Java:处理组合键盘输入

在注册在 JButton 后面的 KeyListenerF1和 ie CTRL+F1各自的SHIFT- CTRL+之间分开的正确方法是什么?F1

.. 总是给我 112 F1, 113F2等等。我知道我可以自己处理 keyPressed() 来处理 keyReleased for CTRL// SHIFT/ALT等,但我希望有更好的方法。

非常感谢!!!

0 投票
1 回答
1927 浏览

javascript - Javascript/Ajax - 从 Sys.EventHandlerList() 中手动删除事件处理程序

我有两个脚本控件,一个持有另一个,并且我已经成功地能够使用以下方法处理来自父级的子级事件:

其中 addItemSelected(on the child) 是:

和 getEvents 是:

问题是在处置父母时,我想做同样的事情:

但是,.control 不再存在。我猜这是因为子控件已经被释放,因此 .control 属性不再起作用。

鉴于此,我决定运行子事件列表并删除其中的所有事件处理程序。

有一个更好的方法吗?

0 投票
4 回答
3255 浏览

c# - 测试事件是否分配了 EventHandler

我想测试一个类是否有一个分配给事件的 EventHandler。基本上我正在使用我的 IoC 容器为我连接 EventHandlers,我想检查它们是否被正确分配。所以真的,我正在测试我的 IoC 配置。

我不确定如何测试 changePersonService.PersonCreated 是否有任何附加内容。

有任何想法吗?

谢谢。

0 投票
2 回答
2816 浏览

delphi - 在 Delphi 2007 中设置事件处理程序并出现“参数列表不同”错误

我正在尝试在Delphi 2007中编写一个使用ActiveX库的类。该类将捕获 ActiveX 库必须公开其自己的事件的事件,该事件将一些信息添加到 ActiveX 库的事件中。

底线是,当我将自己的过程分配给要使用的 ActiveX 库的事件时,会出现错误:

我确定参数列表是相同的(相同数量的参数和相同的类型),所以我认为我的做法是错误的。

任何建议或有人可以发布一些我正在尝试做的示例代码吗?

0 投票
3 回答
1336 浏览

vb.net - 可变按钮 vb.net

我声明了一个全局变量按钮:

将按钮 1 变暗为新按钮()

现在,我不知道如何在此按钮中添加单击事件,因为它是一个变量。你知道我该怎么做吗?

0 投票
1 回答
1445 浏览

c# - 覆盖 Button_click 事件处理程序

我正在使用 MVP 模式开发 WinForms 应用程序。我想将按钮单击的标记值传递给演示者。因为我想获得button.Tag属性,所以我需要 sender 参数是 type Button。如果不这样做,我怎么能做到这一点:

我不得不将对象向下转换为方法参数中的按钮。

0 投票
1 回答
2141 浏览

c++ - 接收 COM 事件

没有:

  • ATL
  • MFC

笔记:

  • C++
  • 进程外COM 对象/服务器
  • 预定义的 TLB 文件

问题:

  • 如何实现一个传出接口,以便 COM 对象可以通知接收事件?
  • 一旦收到,如何妥善处理事件?

下面是我想实现的事件函数 - 来自TLB文件:

问候

0 投票
1 回答
1814 浏览

c++ - 如何在接收器对象上实现传出接口(C++)

我有一个预定义的TLB 文件,其中包含 IS8SimulationEvents 包装器方法实现,例如:

使用 Oleview,我可以看到附加到 COM 对象的IConnectionPointContainer接口。

问题:

  • 如何在接收器对象上实现传出接口,以便客户端接收来自 COM对象的事件通知

没有:

  • ATL
  • MFC