Search code examples
delphiparallel-processingdelphi-xe2omnithreadlibrary

OmniThread: How to pass a TRect in SetParameter?


In a program using the OmniThread library, how can I pass a TRect in SetParameter? Example:

procedure TestParameters(const ATask: IOmniTask);
begin
  // how can I access the TRect here?
end;

FTestTask := CreateTask(TestParameters, 'TestParameters')
               .MonitorWith(OTLMonitor)
               .SetParameter('FormRect', Self.ClientRect) // does not work
               .Run;

Is there a general rule how to use different types in SetParameter?


Solution

  • Use TOmniValue.FromRecord<T> and TOmniValue.ToRecord<T>.

    procedure TestParameters(const ATask: IOmniTask);
    var
      formRect: TRect;
    begin
      formRect := ATask.Param['FormRect'].ToRecord<TRect>;
    end;
    
    FTestTask := CreateTask(TestParameters, 'TestParameters')
                   .MonitorWith(OTLMonitor)
                   .SetParameter('FormRect', TOmniValue.FromRecord<TRect>(ClientRect))
                   .Run;