//     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. 基于链路的OSPF简单口令认证

    实验要求:掌握基于链路的OSPF简单口令认证 拓扑如下: 配置如下: R1enable configure terminal interface s0/0/0ip address 192.168.1. ...

  2. WSDL 文档-一个简单的 XML 文档

    WSDL 文档是利用这些主要的元素来描述某个 web service 的: <portType>-web service 执行的操作 <message>-web service ...

  3. [转] [Elasticsearch] 数据建模 - 处理关联关系(1)

    [Elasticsearch] 数据建模 - 处理关联关系(1) 标签: 建模elasticsearch搜索搜索引擎 2015-08-16 23:55 6958人阅读 评论(0) 收藏 举报 分类: ...

  4. MySQL将DESC等关键字作为列名表名的处理方式

    面试被问到一个问题,假如MySQL中的关键字在查询语句中作为列明或者表名出现,应该怎么处理. 例如 select desc from t; 首先创建一张表,包含两个字段,id和desc 插入了三条数据 ...

  5. ubuntu discuz 该函数需要 PHP 支持 XML。请联系空间商,确定开启了此项功能

    apt-get install php-xml apt-get install php-xml-parser

  6. webgl,threejs教程、笔记

    发现一个不错的博客,学学. webgl和threejs教程

  7. pprof进行golang程序性能分析

    一.导入包 import _ "net/http/pprof" 二.启动监控routine go func() { http.ListenAndServe("0.0.0. ...

  8. [LeetCode&Python] Problem 746. Min Cost Climbing Stairs

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  9. Oracle导入导出表

    使用PL SQL Developer进行操作 一.导出 工具<<导出表<<sql插入<<选择用户和要导出的表,勾选创建表,选择输出文件(格式最好为.sql),点击导 ...

  10. jQ常用选择器

    #id:    $('#div'); //查找id='div'; .class: $('.myclass'); //查找class='myclass';​ element:用于搜索的元素,指向DOM节 ...