代码之家  ›  专栏  ›  技术社区  ›  maf-soft

Delphi中数组到常量数组的转换

  •  1
  • maf-soft  · 技术社区  · 7 年前

    我正在寻找一个简单和理想的一般(或使用泛型)的方式来转换 array 到一个 array of const array of TVarRec ). 我的具体情况是 array of Variant Format() 功能。

    这是我目前所发现的,但在我看来很粗糙:

    function MyFormat(const Fmt: string; const Args: TArray<Variant>): string;
    var
      A: array of TVarRec;
      I: Integer;
    begin
      SetLength(A, Length(Args));
      for I:= Low(Args) to High(Args) do begin
        A[I].VType:= vtVariant;
        A[I].VVariant:= @Args[I];
      end;
      Result:= Format(Fmt, A);
    end;
    

    好像有用。安全吗?

    可以做得更短、更好、更快吗?或者我可以用现成的东西来代替吗?:)


    只是一些额外的想法和有趣的事实:

    System.Rtti.TValue 最近成了我的朋友。然而,它似乎缺少一个功能。我可以使用 TValue.From() TVarRec阵列 TValueArrayToArrayOfConst ,但它并没有真正的帮助,因为我必须构建一个 array of TValue 首先,它不同于存储在单个 TValue ... :(

    至少TValue能够输出一个元素作为TVarRec,所以我想我可以为所有类型的数组创建一个通用的转换器。但是。。。

    你觉得这样行吗?

    for I:= Low(Args) to High(Args) do A[I]:= TValue.From(Args[I]).AsVarRec;
    

    它编译,但是 t值 的内存在使用后释放,并且 TVarRec.VVariant

    1 回复  |  直到 7 年前
        1
  •  4
  •   Arnaud Bouchez    7 年前

    你的功能安全快捷。它只分配一个小的内存数组 A[] ,并通过引用传递所有值。我不能更快地思考任何事情-如果不是过早的优化。我可能只会做一些重构来重用 TArray<variant> TArray<TVarRec> 转换程序。

    TValue.From().AsVarRec 如果你的输入确实是一个 TArray<Variant> .

    TVarRec TArray<TVarRec> TArray<变型> 在调用 format() 功能。

        2
  •  0
  •   JAS    5 年前

    setlength(sa,5);      // or more
    result := format(fmt,[sa[0],sa[1],sa[2],sa[3],sa[4]];