ClientDataSet的版本兼容性数组
在Delphi的早期版本中,Data这个Variant类型的值内部使用的是AnsiString来存贮的字节流,但我并不肯定Delphi从何时开始,将其改成了Byte数组类型,你能够经过VarType函数来检测它的类型。函数
一、将数据集的Data保存到MessagePack协议数据流或文件:spa
var
AMsgPack:TQMsgPack;
begin
AMsgPack:=TQMsgPack.Create;
...
AMsgPack.AsVariant:=ClientDataSet1.Data;
//保存到流AStream中
AMsgPack.SaveToStream(AStream);
//或保存到文件AFileName中
AMsgPack.SaveToFile(AFileName);
...
FreeAndNil(AMsgPack);
end;
二、从MessagePack协议数据流或文件中加载到数据集:
var
AMsgPack:TQMsgPack;
begin
AMsgPack:=TQMsgPack.Create;
//从流AStream中加载
AMsgPack.LoadFromStream(AStream);
//或从文件AFileName中加载
AMsgPack.LoadFromFile(AFileName);
...
ClientDataSet1.Close;
ClientDataSet1.Data:=AMsgPack.AsVariant;
...
FreeAndNil(AMsgPack);
end;
对于早期的版本,咱们须要作一个转换:对象
一、从AnsiString转换为TBytes,而后再赋给AMsgPack。ip
var
S:AnsiString;
ABytes:TBytes;
...
begin
...
//首先将Data赋给一个字符串对象
S:=ClientDataSet1.Data;
//复制到字节流中
SetLength(ABytes,Length(S));
Move(PAnsiChar(S)^,ABytes[0],Length(S));
//用AsBytes替换AsVariant
AMsgPack.AsBytes:=ABytes;
...
end;
二、加载时反过来将字节流反转成AnsiString
var
S:AnsiString;
ABytes:TBytes;
...
begin
...
//首先将Data赋给一个字符串对象
ABytes:=AMsgPack.AsBytes;
SetLength(S,Length(ABytes));
Move(ABytes[0],PAnsiChar(S)^,Length(ABytes));
//而后将字符串赋给Data就行了。
ClientDataSet1.Data:=S;...
end;