【问题标题】:DWScript: using an event in an exposed Delphi classDWScript:在公开的 Delphi 类中使用事件
【发布时间】:2013-05-13 09:55:44
【问题描述】:

我使用TdwsUnit.ExposeRTTI 方法向脚本公开了一个Delphi 类。它适用于基本数据类型。

但是当我添加TNotifyEvent 时它不起作用。我的 Delphi 类有一个 OnChange : TNotifyEvent 属性,当在脚本中分配这个 OnChage 时,我得到一个错误

"Syntax Error: More arguments expected!"

看起来脚本编译器明白我想调用事件处理程序而不是分配OnChange 属性。添加"@" 符号没有帮助。

我的 Delphi 对象如何让一个事件处理程序在脚本中包含他的处理程序代码?

问候。

【问题讨论】:

  • 我认为这不可能以“干净”的方式实现,主要是因为“本机”对象会通过将自身作为 Sender 传递而调用“OnChange”,而不考虑“目标”在代码中侧面,现在,为了实现这一点,你需要在dws中使用特殊调用来调用“OnChange”事件,你也许可以用全局变量之类的方法来做到这一点,但是开销会很大,至少我就是这么看的……
  • 尝试跳过使用 RTTI 来公开您的类并使用 TdwsUnit 在设计时手动添加您的类定义,小心将您的事件过程连同其 Sender 参数一起添加到类定义中。这行为是否相同?
  • @ComputerSaysNo:我真的不在乎 sender 参数。
  • RTTI 暴露器和 TdwsUnit 不支持函数指针/委托类型,您必须在脚本代码中声明它们。如果我正确理解了您的要求,则需要在 Delphi 端实现一个偶数存根,该存根将调用脚本,并将其分配给您的事件。由于 TMethod(和事件)没有任何形式的自动内存管理,这将涉及一些特定于案例的代码来处理清理事件并确保脚本程序和执行不会提前释放。

标签: delphi dwscript


【解决方案1】:

我使用 Windows 消息解决了这个问题。我的脚本现在使用消息泵,并且暴露的实例发布一些自定义消息以向脚本发出事件已发生的信号。然后脚本回调 Delphi 代码以获取详细信息。当然,我必须实现 GetMessage / PeekMessage / TranslateMessage 和 DispatchMessage。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2010-12-31
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多