【问题标题】:Change Variant property-names (Delphi)更改变体属性名称 (Delphi)
【发布时间】:2018-03-12 10:41:56
【问题描述】:

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

现在我想更改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。看来直接修改TDocVariantDataVName成员是最有效的方式,但它是私有成员。

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

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

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

【问题讨论】:

  • 我很好奇人们喜欢在没有任何理由的情况下投反对票。对帮助提问者下次改进问题没有帮助。
  • 您无法使用变体创建新变量。您只能使用现有的变量名称。 .... 即使使用 RTTI,您也无法创建新的数据结构(我认为)。
  • 感谢您的回复。我不想更改变量名称,而是变体中的属性名称。您知道一种类型的 Variant 可以具有属性,例如对象。 @Benedikt

标签: delphi mormot


【解决方案1】:

这个问题在mORMot forum解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2012-01-18
    • 2018-01-20
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多