如何在Delphi2010中使用RTTI设置任意类型的事件处理程序?

如何在Delphi2010中使用RTTI设置任意类型的事件处理程序?,delphi,delphi-2010,rtti,Delphi,Delphi 2010,Rtti,读完这篇文章后,我想知道是否有可能更动态地解决这个问题。例如,我想将任何组件的所有事件处理程序设置为nil 使用TValue.From(SomeMethod)不起作用,原因有二: 1.类型未知(可能是TNotifyEvent、TMouseEvent等) 2.我无法将“SomeMethod”设置为nil(无效强制转换) 在旧的RTTI风格中,我会做如下操作: var NilMethod: TMethod; begin [...] NilMethod.Data := nil; NilMethod

读完这篇文章后,我想知道是否有可能更动态地解决这个问题。例如,我想将任何组件的所有事件处理程序设置为nil

使用
TValue.From(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参数为nil的TMethod值时,TValue.TryCast中存在错误。我会向QC报告的。希望它能在D2011或更新中得到修复。在那之前,尝试一下旧的风格


编辑:报告为。如果你想看到它被修复,那就投票吧。

那么旧式有什么问题吗?它还能用吗?旧样式没什么问题。我只是想使用相同的样式来将处理程序设置为nil以及更改它。如果我想更改,旧样式要求发布方法代码。使用新样式,它也可以是公共的或私人的,我更喜欢这种情况。那么,我真的要把这两种解决方案混合起来吗?