XE3随笔11:Merge、Clone、ForcePath

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses SuperObject;

//Merge 合并
procedure TForm1.Button1Click(Sender: TObject);
var
  jo,jt: ISuperObject;
begin
  jo := SO(‘{X:1}‘);
  jt := SO(‘{Y:2}‘);
  jo.Merge(jt);
  ShowMessage(jo.AsJSon);  // {"Y":2,"X":1}
//
  jo := SO(‘{X:1, Y:2}‘);
  jt := SO(‘{Y:3}‘);
  jo.Merge(jt);
  ShowMessage(jo.AsJSon);  // {"Y":3,"X":1}
//
  jo := SO(‘{X:1, Y:2}‘);
  jt := SO(‘{Y:[5,6,7]}‘);
  jo.Merge(jt);
  ShowMessage(jo.AsJSon);  // {"Y":[5,6,7],"X":1}
//
  jo := SO(‘{A:{x:1, y:2}}‘);
  jt := SO(‘{A:{m:3, n:4}}‘);
  jo.Merge(jt, True);
  ShowMessage(jo.AsJSon);  // {"A":{"y":2,"x":1,"n":4,"m":3}}
end;

//Clone 克隆
procedure TForm1.Button2Click(Sender: TObject);
var
  jo,jt: ISuperObject;
begin
  jo := SO(‘{A:{x:1, y:2, z:3}}‘);
  jt := jo.Clone;

  jt.I[‘A.x‘] := 7;
  jt.I[‘A.y‘] := 8;
  jt.I[‘A.z‘] := 9;

  ShowMessage(jo.AsJSon); // {"A":{"z":3,"y":2,"x":1}}
  ShowMessage(jt.AsJSon); // {"A":{"z":9,"y":8,"x":7}}

  //如果不是克隆
  jo := SO(‘{A:{x:1, y:2, z:3}}‘);
  jt := jo;

  jt.Delete(‘A.x‘);
  jt.Delete(‘A.y‘);

  ShowMessage(jo.AsJSon); // {"A":{"z":3}}
  ShowMessage(jt.AsJSon); // {"A":{"z":3}}
end;

//ForcePath 指向子对象
procedure TForm1.Button3Click(Sender: TObject);
var
  jo,jt,ja: ISuperObject;
begin
  jo := SO(‘{A:{x:1,y:2}, B:[]}‘);

  {通过 ForcePath 可指向一个子对象; 当子对象修改时, 原对象当然也会修改, 本来就是同一个}
  jt := jo.ForcePath(‘A‘);
  jt.I[‘x‘] := 9;
  ShowMessage(jo.AsJSon); // {"B":[],"A":{"y":2,"x":9}}

  {原对象修改, 当然子对象也会修改}
  ja := jo.ForcePath(‘B‘, stArray);
  jo.A[‘B‘][0] := SO(‘m‘);
  jo.A[‘B‘][1] := SO(‘n‘);
  ShowMessage(ja.AsJSon); // ["m","n"]

  {ISuperObject.ForcePath 和 ISuperObject.O[] 差不多, 只是后者是可读写的}
  jo := SO(‘{A:{x:1,y:2}, B:[]}‘);
  jt := jo.O[‘A‘]; //或简写为: jt := jo[‘A‘];
  jt.I[‘x‘] := 8;
  ShowMessage(jo.AsJSon); // {"B":[],"A":{"y":2,"x":8}}
end;

end.
时间: 2024-08-28 13:38:23

XE3随笔11:Merge、Clone、ForcePath的相关文章

Effective Java 英文 第二版 读书笔记 Item 11:Override clone judiciously

x.clone()!=x will be true x.clone().getClass()==x.getClass() will be true x.clone().equals(x) always true. 意味着深复制,新建对象,数据与结构与原对象一致, Copying an object will typically entail creating a new instance of tis class,but it may require copying of internal da

XE3随笔3:访问

测试数据提前加入 Memo1 中: { "name": "张三", /* 注释 */ "age": 33, "sex": true, "weight": 123.456, "tel": ["86-1111111", "86-2222222"], "addresses":{"address":"A省B

XE3随笔17:实例 - 模拟 Google 搜索

本例测试效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Memo1: TMemo;     Edit1: TEdit;     Button1: TButton;     procedure Button1Cl

XE3随笔19:实例 - 借用 Google 实现全文翻译

调用 Google 翻译的地址格式: http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + 原始文本 + "&langpair=" + 原语言 + "%7C" + 目标语言 返回的数据格式如下, 可以用 responseData.translatedText 简单获取: { "responseData" : {"trans

XE3随笔9:使用不同的数据类型标记数组

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;     Button3: TButton;     Button4: TButton;     proc

XE3随笔20:几个和当前路径相关的新函数

偶然从 SysUtils 里发现了几个路径相关的函数, 以前没见过, 可能是 Delphi XE3 新增的: GetLocaleDirectory(); GetLocaleFile(); LocaleDirectoryExists(); LocaleFileExists(); 应用测试: uses IOUtils; procedure TForm1.FormCreate(Sender: TObject); var   p,f: string;   b: Boolean; begin   {设置与

XE3随笔6:SuperObject 的 JSON 对象中还可以包含 "方法"

SuperObject 的 JSON 对象中还可以包含 "方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: ISuperObject; var Result: ISuperObject); //另外, 这是其数据类型的枚举: TSuperType = (stNull, stBoolean, stDouble, stInt, stObject, stArray, stString, stMethod); 测试代码: un

linux随笔(11)---umask和chmod

一.目的 本文将介绍linux环境下有关文件访问模式相关的命令. umask用来设置默认的文件访问模式屏蔽值:chmod用来修改文件的访问模式. 本文将选取ubuntu14.04发行版做为描述基础. 二.文件访问模式 linux使用文件访问模式保证文件的安全性,通过一个12bit的数据结构表示文件访问模式的4组属性: 1.SUID.SGID.Sticky属性 :也叫特殊属性. 2.用户的读.写.可执行属性:也叫用户属性. 3.用户所属组的读.写.可执行属性:也叫用户所属组属性. 4.组内其他用户

XE3随笔2:SuperObject构建JSON

SuperObject 构建一个 JSON 的常用方法: 从字符串.从文件.从流. unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;     Button