Delphi 组件动态分配事件

3

我在表单上有一个ADODStoredProc。它在代码中,不是可视的。通常,如果一个组件是可视的,处理事件就很容易。只需要双击所需的事件即可。但是,如何用代码实现呢?我声明了一个过程:

 procedure SP_SearchAfterScroll(DataSet:TDataSet)

现在我该如何将SP_Search(这是ADOStoredProc)的AfterScroll事件处理程序属性分配给我上面编写的过程。我相信你会回答它。提前致谢。
2个回答

11

当SP_Search是TAdoStoredProc,并且具有OnAfterScroll属性时,你需要做的就是:

SP_Search.OnAfterScroll := SP_SearchAfterScroll;

我假设你使用了正确的SP_SearchAfterScroll签名。也就是说,OnAfterScroll属性的类型应该如下所示:

TScrollEvent = procedure(DataSet: TDataSet) of object;
如果OnAfterScroll属性的类型与此不同,您需要确保您的SP_SearchAfterScroll过程与该类型中的参数匹配。
编辑
在评论中,Mikayil问道:
“`SP_Search.AfterScroll := SP_SearchAfterScroll(SPSearch)'`编译器会抱怨说类型不兼容TNotifyEvent和过程。但是当我写`SP_Search.AfterScroll := SP_SearchAfterScroll`时它可以工作。有什么区别吗?”
我还没有来得及回答,与此同时Mikey解释得很好,因此为了(更容易)将来的参考,我在此处包括他的解释:
`SP_Search.AfterScroll :=`这段代码分配一个函数来处理事件,在触发时 - 你不是在'assign time'调用SP_SearchAfterScroll,只是赋一个值给变量,所以不需要传递参数。当调用被触发时,调用者会使用正确的值分配参数。当您传递参数时,编译器认为您正在调用函数而不是分配它,因此您会得到不兼容的类型错误。当您简单地分配函数而没有参数时,编译器理解您正在分配而不是调用函数。

2
@Mikayil-'SP_Search.AfterScroll:='该代码分配一个函数来处理事件触发时的操作-在“分配时间”中,您没有调用SP_SearchAfterScroll,只是将值分配给变量,因此不需要传递参数。当调用被执行时,需要参数-当事件触发时,调用者将使用正确的值分配参数。当您传递参数时,编译器会认为您正在调用函数,而不是分配它,因此会出现不兼容类型错误。当您仅分配函数而没有参数时,编译器会理解您正在分配而不是调用函数。 - Vector
2
@Mikey:感谢您向Mikayil解释。 我还没有解释清楚,由于我无法更好地解释,所以我已将您的答案添加到我的答案中,以便更容易找到。 - Marjan Venema
1
@Marjan - 谢谢 - 把整个东西压缩到只有600个字符真的很难! - Vector
1
@Mikey,也许被迫将其缩短到600个字符是帮助使其如此清晰的原因? :-) - Marjan Venema
1
@Mikayil- 或许需要一些额外的解释(现在我又有了600个字符……):一个“事件”实际上只是一个“函数指针”变量或“回调”,当你设置一个事件处理程序时,无论是在IDE中还是在运行时,你真正做的就是将要被调用的函数的地址分配给调用者,在“事件触发”时,这就是真正发生的事情。 - Vector
显示剩余2条评论

0

声明如下:

TDataSetNotifyEvent

  • 这样就可以工作了

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接