//     TARec   --->   Variant
function RecordToVariant(value:TParamRecord):OleVariant;
var P:Pointer;
begin
  Result:=VarArrayCreate([0,sizeof(TParamRecord)],varByte);
  P:=VarArrayLock(Result);
  Move(value,P^,sizeof(P));
  VarArrayUnlock(Result);
end;

//   OleVariant   ---->   TARec
function VariantToRecord(value:OleVariant):TParamRecord;
var P:Pointer;
begin
  P:=VarArrayLock(value);
  Move(P^,Result,sizeof(TParamRecord));
  VarArrayUnlock(value);
end;

好像不好使。先留着。

以下不知道好使否,也先留着。

Variant --> Stream

var ov: OleVariant;
  ms: TStream; p: Pointer;
begin
  ov := dmMain.ComConnection.AppServer.TimeZone;
  ms := TMemoryStream.Create;
  ms.Position := 0;
  p := VarArrayLock(ov);
  ms.Write(p^, VarArrayHighBound(ov, 1)); //這句可否改進?
  VarArrayUnlock(ov);

ms.Position := 0;
  ...
  ms.Free;
end;

Stream --> Variant

function TTCanteenSvr.Get_TimeZone: OleVariant;
var
  AStream: TStream;
  MyBuffer: Pointer;
begin
  try
    AStream := TFileStream.Create(, fmOpenRead);
    Result := VarArrayCreate([0, AStream.Size - 1], VarByte);
    MyBuffer := VarArrayLock(Result);
    AStream.ReadBuffer(MyBuffer^, AStream.Size);
    VarArrayUnlock(Result);
  finally
    AStream.Free;
  end;

Record --> Stream

var r,r2:TStockInfo;p:Pointer;iRecSize,StringSize:Integer;
  pc:PChar;
  s:string;v:Variant;
  ms:TMemoryStream;
begin
//  TStockInfo=record
//    SecurityID:string[12];
//    CompanyID:string[12];
//    InternalID:string[12];
//  end;
  // 赋值Record
  r.SecurityID:='123';
  r.CompanyID:='456';
  r.InternalID:='789';
  iRecSize:=SizeOf(TStockInfo);
  StringSize:=SizeOf(string);
  GetMem(p,iRecSize);
  GetMem(pc,StringSize);
  ms:=TMemoryStream.Create;
  // Move测试
  Move(r,p^,iRecSize);  // 赋值到指针
  Move(p^,r2,iRecSize); // 赋值到验证Record
  ms.WriteBuffer(p,iRecSize);
  ms.SaveToFile(AppPath+'test.txt');
//  ShowMessage(r2.SecurityID+','+r2.CompanyID+','+r2.InternalID);
  // 移动指针
  // 这里需要转换指针类型,string->PChar Integer->PInteger Double->PDouble 等等
//  Inc(PChar(p),StringSize);   // 跳过SecurityID
  // 赋值CompanyID
//  Move(P^,pc,StringSize);
//  Move(P^,s,StringSize);
//  ShowMessage(StrPas(pc));
//  Dec(PChar(p),StringSize); // 回来
  FreeMem(p);               // 并且释放
  ms.Free;
end;

Variant <-->Record Variant <-->Stream的更多相关文章

  1. Delphi Record To Stream

    type TUserInfo = record sUserId,sUserName:String; iUserCount:integer; end; procedure TForm1.Button1C ...

  2. C++ VARIANT 学习小记录

    一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++.Java,此外还有JavaScript.VBScript等脚本语言,它们自立门派,各自维护自己的数据类型. C ...

  3. tagVARIANT、VARIANT、_variant_t和COleVariant

    tagVARIANT是一个结构体struct:  C++ Code: tagVARIANT 123456789101112131415161718192021222324252627282930313 ...

  4. C++使用VARIANT实现二维数组的操作

    C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...

  5. 常用数据与VARIANT之间的转换---从网上整理

    //头文件 1 #pragma once class VariantConvert { public: VariantConvert(void); ~VariantConvert(void); pub ...

  6. 第26课 可变参数模板(7)_any和variant类的实现

    1. any类的实现 (1)any类: ①是一个特殊的,只能容纳一个元素的容器,它可以擦除类型,可以将何任类型的值赋值给它. ②使用时,需要根据实际类型将any对象转换为实际的对象. (2)实现any ...

  7. (原创)用c++11打造好用的variant(更新)

    关于variant的实现参考我前面的博文,不过这第一个版本还不够完善,主要有这几个问题: 内部的缓冲区是原始的char[],没有考虑内存对齐: 没有visit功能. 没有考虑赋值构造函数的问题,存在隐 ...

  8. OleVariant Variant

    OleVariant ArrayDimCount OleVariant; System.Variants.hpp   判断OleVariant 是否为空 System::OleVariant ov i ...

  9. boost数据结构variant

    variant和any有些类似,是一种可变类型,是对C/C++中union概念的增强和扩展:    普通的union只能持有普通数据类型,而不能持有string.vector等复杂类型,而varian ...

随机推荐

  1. Spring 配置文件

    <?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id=...> ...

  2. kafka definitive guide - reading notes

    一.认识Kafka 1)什么是sub/pub模型, 发布订阅模型   Publish/subscribe messaging is a pattern that is characterized by ...

  3. JSON JAVA 总结

    1.如下是我所用json第三方jar包的maven坐标 <!--可引用的jar--> <dependency> <groupId>net.sf.json-lib&l ...

  4. 测试那些事儿—浅谈TCP/IP协议

    TCP/IP协议是一系列网络协议的总和,是构成网络通信的核心骨架. TCP/IP的工作原理通俗的讲就是一个主机的数据要经过哪些过程才能发送到对方的主机上. TCP/IP协议采用四层结构,分别为应用层, ...

  5. 陕西师范第七届I题----排队

    链接:https://www.nowcoder.com/acm/contest/121/I来源:牛客网 题目描述 ACM竞赛队内要开运动会啦!!!! 竞赛队内的一群阳光乐观积极的队员们迅速的在操场上站 ...

  6. 20155208徐子涵 2016-2017-2 《Java程序设计》第4周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 继承 继承作为面向对象的第二大特征,基本上就是避免多个类间重复定义 ...

  7. Java依赖注入方式

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  8. 流程控制之if

    流程控制 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的.你要判断那条岔路是你真正要走的路,如果我们想让程序也 ...

  9. gxx -L和/etc/ld.so.conf的理解

    编程之路刚刚开始,错误难免,希望大家能够指出. 今天编了个动态库,然后自己测试了一下. 忘记设置程序运行时系统搜索库的路径发生错误: 忘记设置程序编译的时候 -L 指定路径报的错误: -L : 告诉程 ...

  10. 思科模拟器——允许远程telnet连接控制路由器/交换机

    环境如下: 路由器配置如下.interface f0/0 配置该端口,ip address 192.168.1.1 255.255.255.0 配置ip,no shut激活,line vty 0 4 ...