带有匿名方法的VCL事件-您如何看待此实现?

问题描述 投票:15回答:3

由于匿名方法出现在Delphi中,所以我想在VCL组件事件中使用它们。显然,为了向后兼容,VCL并未更新,因此我设法做了一个简单的实现,但有一些警告。

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

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

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

implementation

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

function TNotifyEventDispatcher.Attach(const 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仍然具有非常常见的事件签名,对于我创建类的每一种特殊情况,它都是永久完成的。

  • 您如何看待这种实现?有什么可以改善的吗?

由于匿名方法出现在Delphi中,所以我想在VCL组件事件中使用它们。显然,为了向后兼容,VCL并未更新,因此我设法使用...

delphi vcl anonymous-methods
3个回答
9
投票

您可以看一下我的multicast event implementation in DSharp


1
投票

您可以使TNotifyEventDispatcher成为TInterfacedObject的子类,因此您不必担心释放它。


1
投票

有趣的方法。

© www.soinside.com 2019 - 2024. All rights reserved.