0

我正在为 Delphi 学习一个很棒的框架 mORMot,并且我发现了很多有用的函数可以处理Variant(在 SynCommons 中)。

现在我想更改 a 的一些属性名称Variant,但搜索后我没有找到这样的功能,所以我决定写一个:

program Project7;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, SynCommons;

function VariantChangeNames(var V: Variant; const FromNames, ToNames: TRawUTF8DynArray): Boolean;
var
  Name: RawUTF8;
  PData: PDocVariantData;
  Val: Variant;
  i, k: Integer;
begin
  Result := False;
  PData := DocVariantData(V);
  i := 0;
  for Name in FromNames do
  begin
    k := PData^.GetValueIndex(Name);
    if k <> -1 then
    begin
      Val := PData^.Value[k];
      PData^.Value[ToNames[i]] := Val;
      PData^.Delete(k); // If delete before setting value, Val will be incorrect.
      Result := True;
    end;
    Inc(i);
  end;
end;

var
  V: Variant;
begin
  V := TDocVariant.New();
  V.Name := 'John';
  V.Age := 20;
  VariantChangeNames(V, ['Name'], ['RealName']);
  Writeln(VariantToString(V)); // {"Age":20,"RealName":"John"}
end.

VariantChangeNames我写的可能不是很有效,因为它需要同时做deleteadd。似乎直接修改VName成员TDocVariantData是最有效的方法,但它是一个私有成员。

有什么建议吗?提前致谢。

BTW:mORMot官方论坛的邮件服务器好像有问题,我发帖的时候显示:

An error was encountered
Error: Could not connect to smtp host "217.70.184.11" (111) (Connection refused).
4

1 回答 1

0

这个问题在mORMot 论坛中得到了解决。

于 2018-03-14T04:11:39.640 回答