События VCL с анонимными методами - что вы думаете об этой реализации?

Поскольку в Delphi появились анонимные методы, я хотел использовать их в событиях компонентов VCL. Очевидно, что для обратной совместимости VCL не обновлялся, поэтому мне удалось сделать простую реализацию с некоторыми оговорками.

type
  TNotifyEventDispatcher = class(TComponent)
  protected
    FClosure: TProc<TObject>;

    procedure OnNotifyEvent(Sender: TObject);
  public
    class function Create(Owner: TComponent; Closure: TProc<TObject>): TNotifyEvent; overload;

    function Attach(Closure: TProc<TObject>): TNotifyEvent;
  end;

implementation

class function TNotifyEventDispatcher.Create(Owner: TComponent; Closure: TProc<TObject>): TNotifyEvent;
begin
  Result := TNotifyEventDispatcher.Create(Owner).Attach(Closure)
end;

function TNotifyEventDispatcher.Attach(Closure: TProc<TObject>): TNotifyEvent;
begin
  FClosure := Closure;
  Result := Self.OnNotifyEvent
end;

procedure TNotifyEventDispatcher.OnNotifyEvent(Sender: TObject);
begin
  if Assigned(FClosure) then
    FClosure(Sender)
end;

end.

И вот как он используется, например:

procedure TForm1.FormCreate(Sender: TObject);
begin    
  Button1.OnClick := TNotifyEventDispatcher.Create(Self,
    procedure (Sender: TObject)
    begin
      Self.Caption := 'DONE!'
    end)
end;

Я считаю, что очень просто, есть два недостатка:

  • Мне нужно создать компонент для управления временем жизни анонимного метода (я трачу немного больше памяти , и это немного медленнее для косвенного обращения, тем не менее я предпочитаю более четкий код в своих приложениях)

  • Мне нужно реализовать новый класс (очень простой) для каждой сигнатуры события. Это немного сложнее, тем не менее, VCL имеет очень распространенные сигнатуры событий, и для каждого особого случая, когда я создаю класс, это делается навсегда.

Что вы думаете об этой реализации? Что-нибудь, чтобы сделать его лучше?

15
задан Heinrich Ulbricht 6 November 2011 в 12:29
поделиться