Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: TThreadPool.Default.QueueWorkItem - wie parameter mitgeben

  Alt 27. Apr 2015, 08:28
Hier mal den Wrapper in einer eigenen Unit mit bis zu 4 Argumenten
Delphi-Quellcode:
unit Generics.Utils;

interface

uses
  System.SysUtils;

type
  TWrapper = class
    class function Proc<T>( AProc: TProc<T>; Arg: T ): TProc; overload;
    class function Proc<T1, T2>( AProc: TProc<T1, T2>; Arg1: T1; Arg2: T2 ): TProc; overload;
    class function Proc<T1, T2, T3>( AProc: TProc<T1, T2, T3>; Arg1: T1; Arg2: T2; Arg3: T3 ): TProc; overload;
    class function Proc<T1, T2, T3, T4>( AProc: TProc<T1, T2, T3, T4>; Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4 ): TProc; overload;
  end;

implementation

{TWrapper}

class function TWrapper.Proc<T1, T2, T3, T4>( AProc: TProc<T1, T2, T3, T4>; Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4 ): TProc;
begin
  Result := procedure
    begin
      AProc( Arg1, Arg2, Arg3, Arg4 );
    end;
end;

class function TWrapper.Proc<T1, T2, T3>( AProc: TProc<T1, T2, T3>; Arg1: T1; Arg2: T2; Arg3: T3 ): TProc;
begin
  Result := procedure
    begin
      AProc( Arg1, Arg2, Arg3 );
    end;
end;

class function TWrapper.Proc<T1, T2>( AProc: TProc<T1, T2>; Arg1: T1; Arg2: T2 ): TProc;
begin
  Result := procedure
    begin
      AProc( Arg1, Arg2 );
    end;
end;

class function TWrapper.Proc<T>( AProc: TProc<T>; Arg: T ): TProc;
begin
  Result := procedure
    begin
      AProc( Arg );
    end;
end;

end.
Und nun ein kleines Beispiel
Delphi-Quellcode:
program dp_184827;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  Generics.Utils in 'Generics.Utils.pas';

procedure DoFoo( AStr: string; AInt: Integer );
begin
  Writeln( 'CALL DoFoo( AStr: ', QuotedStr( AStr ), ', AInt: ', AInt );
end;

procedure Test;
var
  LProc: TProc;
begin
  // Direkter Aufruf von DoFoo
  DoFoo(
    {AStr} 'Ein String',
    {AInt} 42 );

  // Wrappen mit Argumenten
  LProc := TWrapper.Proc<string, Integer>(
    {AProc} DoFoo,
    {Arg1} 'Ein String',
    {Arg2} 42 );

  // Aufrufen
  LProc( );
end;

begin
  try
    Test;
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat