//     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. 【Python】多进程-4

    #练习:用event事件控制进程执行顺序,下面例子中,主进程main函数在创建了子进程之后,依然会往下执行,所以会出现主进程先打印出来的情况 import multiprocessing import ...

  2. ecmall 开发一个新模块

    要开发新模块,要借鉴原有模块的代码并进行修改. 首先打开目录external/modules 会有一个datacall文件夹,这个文件夹对应的就是一个模块. 复制datacall文件夹,重命名为tes ...

  3. Spring Boot 揭秘与实战(五) 服务器篇 - Tomcat 代码配置

    Spring Boot 内嵌的 Tomcat 服务器默认运行在 8080 端口.如果,我们需要修改Tomcat的端口,我们可以在 src/main/resources/application.prop ...

  4. Prepare paddle in Docker

    1. Install Docker sudo apt-get install -y docker.io a) pull repository from server in China, here is ...

  5. Python学习笔记第二十四周(JavaScript补充)

    目录: 一.JS补充 1.函数类型 2.string对象 3.instanceof 4.Array 数组对象 5.Date对象 6.RegExp 正则表达式 7.Math对象 二.BOM补充 1.wi ...

  6. aliyun服务器对象存储oss

    aliyun OSS 使用简单.方便. 官方网址 aliyun.com 首先通过aliyun管理控制台申请OSS服务.通过AccessKeys分配Access Key ID和Access Key Se ...

  7. C与C++中实现 gotoxy()函数

    #include <stdio.h> #include <windows.h> void gotoxy(int x, int y) { COORD pos = {x,y}; H ...

  8. HDU 2561

    F - 第二第二 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Prac ...

  9. js的数据类型。

    字符串   String 数字    Number 布尔    Boolean Null     空 Undefined Object   对象  Array 数组   json   function ...

  10. acm 2084

    ////////////////////////////////////////////////////////////////////////////////#include<iostream ...