anchor.diff:    end;
   end;
   
  +procedure RawValueCopyFrom(pvSource, pvDest: PDRawValue; pvIgnoreValueTypes:
  +    TDValueDataTypes = [vdtInterface, vdtObject, vdtPtr]);
  +var
  +  l:Int64;
  +  i: Integer;
  +begin
  +  ClearDValue(pvDest);
  +  if pvSource.ValueType in pvIgnoreValueTypes then Exit;  
  +  if pvSource.ValueType <> vdtUnset then
  +  begin
  +    case pvSource.ValueType of
  +      vdtGuid:
  +        begin
  +          CheckDValueSetType(pvDest, vdtGuid);
  +          pvDest.Value.AsGuid^:= pvSource.Value.AsGuid^;
  +        end;
  +      vdtString:
  +        begin
  +          CheckDValueSetType(pvDest, vdtString);
  +          pvDest.Value.AsString^:= pvSource.Value.AsString^;
  +        end;
  +      vdtStringW:
  +        begin
  +          CheckDValueSetType(pvDest, vdtStringW);
  +          pvDest.Value.AsStringW^:= pvSource.Value.AsStringW^;
  +        end;
  +      vdtStream:
  +        begin
  +          CheckDValueSetType(pvDest, vdtStream);
  +          TMemoryStream(pvDest.Value.AsStream).LoadFromStream(
  +            TMemoryStream(pvSource.Value.AsStream));
  +        end;
  +      vdtInterface:
  +        begin
  +          CheckDValueSetType(pvDest, vdtInterface);
  +          pvDest.Value.AsInterface^:= pvSource.Value.AsInterface^;
  +        end;
  +      vdtObject:
  +        begin
  +          CheckDValueSetType(pvDest, vdtObject);
  +          pvDest.Value.AsPointer := pvSource.Value.AsPointer;
  +      {$IFDEF NEXTGEN}
  +          // ƶƽ̨ADataļҪӣԱԶͷ
  +          TObject(pvDest.Value.AsPointer).__ObjAddRef;
  +      {$ENDIF}
  +          pvDest.Value.PtrReleaseAction := praNone;   // ãд
  +        end;
  +      vdtPtr:
  +        begin
  +          CheckDValueSetType(pvDest, vdtPtr);
  +          pvDest.Value.AsPointer := pvSource.Value.AsPointer;
  +          pvDest.Value.PtrReleaseAction := praNone;   // ãд
  +        end;
  +      vdtArray:
  +        begin
  +          CheckDValueSetArrayLength(pvDest, pvSource.Value.ArrayLength);
  +          for i := 0 to pvSource.Value.ArrayLength -1 do
  +          begin
  +             RawValueCopyFrom(
  +                GetDValueItem(pvSource, i),
  +                GetDValueItem(pvDest, i));
  +          end;
  +        end;
  +    else
  +      begin
  +        pvDest.Value := pvSource.Value;
  +      end;
  +    end;
  +    pvDest.ValueType := pvSource.ValueType;
  +  end;
  +end;
  +
   destructor TDValueObject.Destroy;
   begin
     ClearDValue(@FRawValue);
  
positive.code: procedure DValueSetAsFloat(ADValue:PDRawValue; pvValue:Double);
  function DValueGetAsFloat(ADValue: PDRawValue): Double;
  
  
  procedure DValueSetAsBoolean(ADValue:PDRawValue; pvValue:Boolean);
  function DValueGetAsBoolean(ADValue: PDRawValue): Boolean;
  
  function BinToHex(p: Pointer; l: Integer; ALowerCase: Boolean): DStringW; overload;
  function BinToHex(const ABytes: TBytes; ALowerCase: Boolean): DStringW; overload;
  
negative.code:   ClearDValue(@FRawValue);
  end;
  
  procedure TDValueItem.CloneFrom(pvSource: TDValueItem; pvIgnoreValueTypes:
      TDValueDataTypes = [vdtInterface, vdtObject, vdtPtr]);
  begin
    RawValueCopyFrom(@pvSource.FRawValue, @FRawValue, pvIgnoreValueTypes);
  end;
  
  function TDValueItem.Equal(pvItem:TDValueItem): Boolean;
  begin
    Result := CompareDValue(@FRawValue, @pvItem.FRawValue) = 0;
  