阅读帖子How to set event handlers via new RTTI?后,我想知道是否有可能更动态地解决这个问题。例如,我想将任何组件的ALL事件处理程序设置为nil。
使用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);
答案 0 :(得分:8)
以下代码应该有效:
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参数为 nil 的TMethod值时,TValue.TryCast中存在错误。我会把它报告给QC。希望它能在D2011或更新中得到修复。在那之前,试试旧式。
编辑:报告为QC# 81416。如果你想看到它修复它,请投票。