anchor.diff:    end;
   
   
  -
  -
  -
  -
  -
  -
  +  /// <summary>
  +  ///   DValueڵ
  +  /// </summary>
  +  TDValueNode = class(TObject)
  +  private
  +    FName: TDValueItem;
  +    FValue: TDValueItem;
  +    FNodeType: TDValueNodeType;
  +    
  +    {$IFDEF HAVE_GENERICS}
  +    FChildren: TList<TDValueNode>;
  +    {$ELSE}
  +    FChildren: TList;
  +    {$ENDIF}
  +  private
  +    function GetCount: Integer;
  +    procedure ClearChildren();
  +    procedure CheckCreateChildren;
  +    procedure CreateName();
  +    procedure DeleteName();
  +    /// <summary>
  +    ///   Ʋӽڵ
  +    /// </summary>
  +    function IndexOf(pvName: string): Integer;
  +  public
  +    constructor Create(pvType: TDValueNodeType);
  +    
  +    destructor Destroy; override;
  +
  +    /// <summary>
  +    ///   ýڵ, תʱᶪʧ
  +    /// </summary>
  +    procedure CheckSetNodeType(pvType:TDValueNodeType);
  +
  +    function ItemByName(pvName:string):TDValueItem;
  +
  +    property Count: Integer read GetCount;
  +    property Name: TDValueItem read FName;
  +    property Value: TDValueItem read FValue;
  +  end;
  +
  +  TDValueItem = class(TObject)
  +  private
  +    FRawValue: TDValueRecord;
  +    function GetAsBoolean: Boolean;
  +    function GetAsFloat: Double;
  +    function GetAsInetger: Int64;
  +    function GetAsString: String;
  +    function GetDataType: TDValueDataType;
  +    procedure SetAsBoolean(const Value: Boolean);
  +    procedure SetAsFloat(const Value: Double);
  +    procedure SetAsInetger(const Value: Int64);
  +    procedure SetAsString(const Value: String);
  +  public
  +    destructor Destroy; override;
  +    function Equal(pvItem:TDValueItem): Boolean;
  +    property AsFloat: Double read GetAsFloat write SetAsFloat;
  +    property AsString: String read GetAsString write SetAsString;
  +    property AsInetger: Int64 read GetAsInetger write SetAsInetger;
  +    property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;
  +    property DataType: TDValueDataType read GetDataType;
  +  end;
  +
  +
  +
  +
  +
  +
  +
  +function CompareDValue(pvDValue1: PDValueRecord; pvDValue2:PDValueRecord):
  +    Integer;
   
   function GetDValueSize(ADValue: PDValueRecord): Integer;
   function GetDValueItem(ADValue: PDValueRecord; pvIndex: Integer): PDValueRecord;
  
positive.code: 
    TDValueDataType = (vdtUnset, vdtNull, vdtBoolean, vdtSingle, vdtFloat,
      vdtInteger, vdtInt64, vdtCurrency, vdtGuid, vdtDateTime,
      vdtString, vdtStream, vdtArray);
  
  
    PDValueRecord = ^TDValueRecord;
  
negative.code:   end;
  end;
  
  procedure DValueSetAsStringW(ADValue:PDValueRecord; pvString:DStringW);
  begin
    CheckDValueSetType(ADValue, vdtString);
    ADValue.Value.AsString^ := pvString;
  end;
  
  function DValueGetAsStringW(ADValue:PDValueRecord): DStringW;
  var
    lvHexStr:DStringW;
    function DTToStr(ADValue: PDValueRecord): DStringW;
  