//     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. 【Think in java读书笔记】IO系统

    一.FIle类(处理文件目录问题) if else的另外一种写法 ,不加大括号也可以 import java.io.File; import java.io.FilenameFilter; impor ...

  2. 顶部BANNER

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. websocket js 代码样例

    function StartWebSocket(wsUri) { websocket = new WebSocket(wsUri); websocket.onopen = function(evt) ...

  4. Linux关闭透明大页配置

      一.为何要关闭透明大页 A--MOS获取 . #翻译 由于透明超大页面已知会导致意外的节点重新启动并导致RAC出现性能问题,因此Oracle强烈建议禁用透明超大页面. 另外,即使在单实例数据库环境 ...

  5. [LeetCode&Python] Problem 733. Flood Fill

    An image is represented by a 2-D array of integers, each integer representing the pixel value of the ...

  6. Z遮罩层完全覆盖页面

    不要使用absolute定位,用fixed就行.然后 background:rgba(0, 0, 0, 0.5); position:fixed; z-index: 100; left:0; righ ...

  7. MyBatis 遍历数组放入in中

    必须要遍历出数组的值放入in中 如果直接将"'2','3','4','5','6','7','8'" 字符串放入in中,只会查出 inv_operate_type的值为2的数据,因 ...

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

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

  9. PTA——支票面额

    PTA 7-38 支票面额 #include<stdio.h> int main() { int n,f,y; ; scanf("%d",&n); ; flag ...

  10. java-继承的注意事项

    1.子类只能继承父类所有非私有的成员(成员方法和成员变量). 2.子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法. 3.不要为了部分功能而去继承.