Ein schnelles Beispiel, ungetestet:
Delphi-Quellcode:
uses
Rtti;
type
TMyRecord<T> =
record
Value: T;
end;
TMyRunner = reference
to procedure;
TFormXY =
class(TForm)
public
procedure MyCallProc<T>(
const Value: TMyRecord<T>);
end;
var
FormXY: TFormXY;
implementation
procedure AddToQueue1(
const AQueue: TQueue<TMyRunner>);
var
MyRecord: TMyRecord<Integer>;
begin
MyRecord.Value := 1002;
AQueue.Enqueue(
procedure
begin
FormXY.MyCallProc<Integer>(MyRecord);
end);
end;
procedure AddToQueue2(
const AQueue: TQueue<TMyRunner>);
var
MyRecord: TMyRecord<
string>;
begin
MyRecord.Value := '
Oh, ein String!';
AQueue.Enqueue(
procedure
begin
FormXY.MyCallProc<
string>(MyRecord);
end);
end;
procedure TFormXY.FormCreate(Sender: TObject);
var
ExampleQueue: TQueue<TMyRunner>;
begin
ExampleQueue := TQueue<TMyRunner>.Create;
try
AddToQueue1(ExampleQueue);
AddToQueue2(ExampleQueue);
while ExampleQueue.Count > 0
do
ExampleQueue.Dequeue.Invoke;
finally
ExampleQueue.Free;
end;
end;
procedure TFormXY.MyCallProc<T>(
const Value: TMyRecord2<T>);
begin
if TypeInfo(T) = TypeInfo(Integer)
then
ShowMessage(IntToStr(TValue.From<T>(Value.Value).AsType<Integer>))
else if TypeInfo(T) = TypeInfo(
String)
then
ShowMessage(TValue.From<T>(Value.Value).AsType<
String>)
else
//...
end;
Nicht sauber geschrieben, aber sollte so gehen und zeigen wie ich das meinte.