读完帖子后如何通过新的 RTTI 设置事件处理程序? https://stackoverflow.com/questions/1482461/how-to-set-event-handlers-via-new-rtti-d2010,我想知道是否可以更动态地解决这个问题。例如,我想将任何组件的所有事件处理程序设置为 nil。
Using TValue.From <TNotifyEvent> (SomeMethod)
不起作用有两个原因:
1. 类型未知(可能是 TNotifyEvent、TMouseEvent 等)
2.我无法将“SomeMethod”设置为nil(无效转换)
在旧的 RTTI 风格中,我会做类似的事情:
var
NilMethod: TMethod;
begin
[...]
NilMethod.Data := nil;
NilMethod.Code := nil;
SetMethodProp (AComponent,PropertyName,NilMethod);
下面的代码应该可以工作:
procedure NilAllEventHandlers(myObject: TObject);
var
context: TRttiContext;
rType: TRttiType;
field: TRttiField;
value: TValue;
nilMethod: TMethod;
begin
nilMethod.Code := nil;
nilMethod.Data := nil;
context := TRttiContext.Create;
rType := context.GetType(TButton);
for field in rType.GetFields do
begin
if field.FieldType.TypeKind = tkMethod then
begin
TValue.Make(@nilMethod, field.FieldType.Handle, value);
field.SetValue(myObject, value);
end;
end;
end;
但事实并非如此,因为在使用 .Code 参数为的 TMethod 值时,TValue.TryCast 中存在错误nil。我会将其报告给QC。希望它能在 D2011 或更新中得到修复。在那之前,尝试一下旧的风格。
编辑:报告为QC# 81416 http://qc.embarcadero.com/wc/qcmain.aspx?d=81416。如果您想修复它,请投票。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)