Delphi中如何动态收集const数组?

问题描述 投票:0回答:1

如果我有一个动态数组并希望将其作为开放数组参数传递给函数怎么办?

procedure DoThis(const Args: array of const);

procedure DoThat(const Values: TArray<String>);
begin

  DoThis(Values);

end;

我应该将动态数组转换为什么才能将其作为开放数组传递? (静态数组传输没有问题。)

你不能指定一个开放数组作为函数的结果,所以你不能用这种方式解决问题。我尝试使用 var open array 转换动态数组,但 var open array 无法设置长度。问题是我们无法控制开放数组的长度,只能使用开放数组构造函数。也许有办法直接将数据写入内存?还是别的什么?

delphi delphi-xe delphi-11-alexandria
1个回答
0
投票

让我强调一下,当

DoThis
会被声明为

procedure DoThis(const Args: array of string);

调用

DoThis(Values)
可以立即使用。问题出在
const
中的
array of const

Unit System.Rtti.pas 提供适合创建

function TValueArrayToArrayOfConst
array of const
,但它需要
TArray<TValue>
才能这样做。因此,要将
TArray<T>
转换为
array of const
,类似的函数可能如下所示:

type
  TConvert = record
  public
    class function ConvertToArrayOfConst<T>(const Params: TArray<T>): TArray<TVarRec>; static;
  end;

class function TConvert.ConvertToArrayOfConst<T>(const Params: TArray<T>): TArray<TVarRec>;
var
  I: Integer;
begin
  SetLength(Result, Length(Params));
  for I := Low(Result) to High(Result) do
    Result[I] := TValue.From<T>(Params[I]).AsVarRec;
end;
© www.soinside.com 2019 - 2024. All rights reserved.