如何在 Delphi 2010 中使用 RTTI 设置任意类型的事件处理程序?
阅读文章后 如何通过新的 RTTI 设置事件处理程序?< /a>,我想知道是否可以更动态地解决这个问题。例如,我想将任何组件的所有事件处理程序设置为 nil。
使用 TValue.From
在旧的RTTI风格中,我会做类似的事情:
var
NilMethod: TMethod;
begin
[...]
NilMethod.Data := nil;
NilMethod.Code := nil;
SetMethodProp (AComponent,PropertyName,NilMethod);
after reading the post How to set event handlers via new RTTI?, I wonder if it is possible to solve this more dynamically. For example I want to set ALL event handlers of any component to nil.
Using TValue.From <TNotifyEvent> (SomeMethod)
does not work for two reasons:
1. The type is unknown (could be TNotifyEvent, TMouseEvent etc.)
2. I cannot set 'SomeMethod' to nil (invalid cast)
In old RTTI style I would do something like:
var
NilMethod: TMethod;
begin
[...]
NilMethod.Data := nil;
NilMethod.Code := nil;
SetMethodProp (AComponent,PropertyName,NilMethod);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
以下代码应该可以工作:
但是却不能,因为在使用 .Code 参数为 nil 的 TMethod 值时,TValue.TryCast 中存在错误。我会将其报告给QC。希望它能在 D2011 或更新中得到修复。在那之前,尝试旧风格。
编辑:报告为 QC# 81416。如果您想修复它,请投票。
The following code ought to work:
But it doesn't because there's a bug in TValue.TryCast when working with a TMethod value whose .Code parameter is nil. I'll report it to QC. Hopefully it'll get fixed in D2011 or an update. Until then, try the old style.
EDIT: Reported as QC# 81416. Vote it up if you want to see it fixed.