Следующий код должен работать:
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;
Но это не так, потому что в TValue.TryCast есть ошибка при работе со значением TMethod, чей параметр .Code равен nil . Я сообщу об этом КК. Надеюсь, это будет исправлено в D2011 или обновлении. А пока попробуйте старый стиль.
РЕДАКТИРОВАТЬ: Сообщается как QC # 81416 . Проголосуйте, если хотите увидеть исправление.