Как установить обработчики событий произвольного типа с RTTI в Delphi 2010?

после прочтения сообщения Как настроить обработчики событий через новый RTTI?, интересно, можно ли решить эту проблему более динамично. Например, я хочу установить для ВСЕХ обработчиков событий любого компонента значение 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);

person Christian Metzler    schedule 22.01.2010    source источник
comment
Так что плохого в старом стиле? Неужели все еще не работает?   -  person Rob Kennedy    schedule 22.01.2010
comment
В старом стиле нет ничего плохого. Я просто хотел использовать тот же стиль для установки обработчика на ноль, а также для его изменения. Старый стиль требует публикации кода метода, если я хочу его изменить. Используя новый стиль, он также может быть публичным или частным, что мне больше нравится в данном случае. Так действительно ли мне нужно смешивать оба решения?   -  person Christian Metzler    schedule 22.01.2010


Ответы (1)


Следующий код должен работать:

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. Я сообщу об этом в QC. Надеюсь, это будет исправлено в D2011 или в обновлении. А пока попробуйте старый стиль.

РЕДАКТИРОВАТЬ: Сообщается как QC # 81416. Проголосуйте за это, если хотите, чтобы это было исправлено.

person Mason Wheeler    schedule 22.01.2010