Bläddra i källkod

* Add typed command handler

Michael Van Canneyt 4 månader sedan
förälder
incheckning
4e58143aa7
1 ändrade filer med 11 tillägg och 0 borttagningar
  1. 11 0
      packages/rtl/src/Rtl.WorkerCommands.pas

+ 11 - 0
packages/rtl/src/Rtl.WorkerCommands.pas

@@ -79,6 +79,7 @@ Type
   TCommandDispatcherClass = class of TCommandDispatcher;
 
   TCommandHandler = Reference to procedure(aCommand : TCustomWorkerCommand);
+  generic TTypedCommandHandler<T : TCustomWorkerCommand> = Reference to procedure(aCommand : T);
   TCommandHandlerArray = array of TCommandHandler;
 
   { TCommandDispatcher }
@@ -124,6 +125,8 @@ Type
     Procedure RegisterCommandHandler(const aCommand : string; aHandler : TCommandHandler);
     // Remove the given command handler for command aCommand
     Procedure UnRegisterCommandHandler(const aCommand : string; aHandler : TCommandHandler);
+    // Register a command handler for command aCommand
+    Generic Procedure AddCommandHandler<T : TCustomWorkerCommand>(const aCommand : string; aHandler : specialize TTypedCommandHandler<T>);
     // Register a worker for broadcast
     Procedure RegisterWorker(aWorker : TJSWorker; const aName : string);
     // Remove a worker from broadcast list
@@ -386,6 +389,14 @@ begin
     end;
 end;
 
+generic procedure TCommandDispatcher.AddCommandHandler<T>(const aCommand: string; aHandler: specialize TTypedCommandHandler<T>);
+begin
+  RegisterCommandHandler(aCommand,procedure (aCmd : TCustomWorkerCommand)
+    begin
+      aHandler(T(aCmd));
+    end);
+end;
+
 procedure TCommandDispatcher.RegisterWorker(aWorker: TJSWorker; const aName: string);
 var
   lReg : TJSWorkerReg;