Поскольку анонимные методы появились в 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 имеет очень распространенные сигнатуры событий и для каждого отдельного случая, когда я создаю класс, который он выполнял навсегда.
Что вы думаете об этой реализации? Что-то сделать лучше?