Question: how do I pass (unknown) parameters to a generic record?
Background: I want a simple way to convert 1:1 event properties to 1:n event properties. Instead of adding Add... and Remove... handlers to handle multiple event methods, I'm trying a generic record.
The following record with example allows to either pass a single method, or add multiple ones to the same property.
The point where I'm looking to simplify things is within calling the events. I can add a trigger method (TSomeClass.Test as below) that iterates through events. I would love to have the iterator within the generic record, like
TEventMultiplexer.Trigger(<TEventParameters>) begin for t in Events do t(<TEventParameters>) end
...
Is there any way to do that with generics?
TEventMultiplexer<TEvent> = record
Events: array of TEvent;
class operator implicit(AnEvent: TEvent): TEventMultiplexer<TEvent>;
class operator explicit(AMultiplexer: TEventMultiplexer<TEvent>): TEvent;
class operator add(AMultiplexer: TEventMultiplexer<TEvent>; AnEvent: TEvent): TEventMultiplexer<TEvent>;
class operator subtract(AMultiplexer: TEventMultiplexer<TEvent>; AnEvent: TEvent): TEventMultiplexer<TEvent>;
end;
TSomeClass = class
private
FOnSome: TEventMultiplexer<TOnSomeEvent>;
public
procedure Test(AIndex: integer; AText: string);
property OnSome: TEventMultiplexer<TOnSomeEvent> read FOnSome write FOnSome;
end;
...
FTestClass.OnSome := Test1;
FTestClass.OnSome := FTestClass.OnSome + Test2;
...
procedure TSomeClass.Test(AIndex: integer; AText: string);
var
t: TOnSomeEvent;
begin
for t in FOnSome.Events do begin
t(AIndex, AText);
end;
end;