Как установить обработчики событий произвольного типа с RTTI в Delphi 2010? - PullRequest
2 голосов
/ 22 января 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);

1 Ответ

8 голосов
/ 22 января 2010

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

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 . Проголосуйте, если хотите увидеть исправление.

...