由于匿名方法出现在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并未更新,因此我设法使用...
您可以使TNotifyEventDispatcher
成为TInterfacedObject
的子类,因此您不必担心释放它。
有趣的方法。