2

投稿を読んだ後新しいRTTIを介してイベントハンドラーを設定する方法は?、これをもっと動的に解決できるのではないかと思います。たとえば、任意のコンポーネントのすべてのイベントハンドラーをnilに設定したいとします。

次の2つの理由により、使用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);
4

1 に答える 1

9

次のコードは機能するはずです。

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として報告されました。修正したい場合は、投票してください。

于 2010-01-22T12:55:10.663 に答える