zoukankan      html  css  js  c++  java
  • ClientDataSet的版本兼容性

    ClientDataSet的版本兼容性

    在Delphi的早期版本中,Data这个Variant类型的值内部使用的是AnsiString来存贮的字节流,但我并不确定Delphi从什么时候开始,将其改为了Byte数组类型,你可以通过VarType函数来检测它的类型。

    1、将数据集的Data保存到MessagePack协议数据流或文件:

    var
       AMsgPack:TQMsgPack;
    begin
      AMsgPack:=TQMsgPack.Create;
      ...
      AMsgPack.AsVariant:=ClientDataSet1.Data;
      //保存到流AStream中
      AMsgPack.SaveToStream(AStream);
      //或保存到文件AFileName中
      AMsgPack.SaveToFile(AFileName);
      ...
      FreeAndNil(AMsgPack);
    end;
     
    2、从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;
     

    对于早期的版本,我们需要做一个转换:

    1、从AnsiString转换为TBytes,然后再赋给AMsgPack。

    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;
     
    2、加载时反过来将字节流反转成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;
     
  • 相关阅读:
    HTML onblur 事件属性
    插入光标颜色 | caret-color (Basic User Interface) – CSS 中文开发手册
    gc (Runtime) – Python 中文开发手册
    《宾狗》
    《凭什么相信你,我的CNN模型?(篇二:万金油LIME)》
    《凭什么相信你,我的CNN模型?(篇一:CAM和Grad-CAM)》
    《如何利用CAM(类激活图)动态可视化模型的学习过程》
    《Attention最新进展》
    TCP-IP四书五经
    《统计学习方法》
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/9399943.html
Copyright © 2011-2022 走看看