Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.663 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Generischen Typ "merken" zur späteren Verwendung

  Alt 20. Jun 2012, 12:22
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat