Variant <-->Record Variant <-->Stream
// 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的更多相关文章
- Delphi Record To Stream
type TUserInfo = record sUserId,sUserName:String; iUserCount:integer; end; procedure TForm1.Button1C ...
- C++ VARIANT 学习小记录
一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++.Java,此外还有JavaScript.VBScript等脚本语言,它们自立门派,各自维护自己的数据类型. C ...
- tagVARIANT、VARIANT、_variant_t和COleVariant
tagVARIANT是一个结构体struct: C++ Code: tagVARIANT 123456789101112131415161718192021222324252627282930313 ...
- C++使用VARIANT实现二维数组的操作
C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...
- 常用数据与VARIANT之间的转换---从网上整理
//头文件 1 #pragma once class VariantConvert { public: VariantConvert(void); ~VariantConvert(void); pub ...
- 第26课 可变参数模板(7)_any和variant类的实现
1. any类的实现 (1)any类: ①是一个特殊的,只能容纳一个元素的容器,它可以擦除类型,可以将何任类型的值赋值给它. ②使用时,需要根据实际类型将any对象转换为实际的对象. (2)实现any ...
- (原创)用c++11打造好用的variant(更新)
关于variant的实现参考我前面的博文,不过这第一个版本还不够完善,主要有这几个问题: 内部的缓冲区是原始的char[],没有考虑内存对齐: 没有visit功能. 没有考虑赋值构造函数的问题,存在隐 ...
- OleVariant Variant
OleVariant ArrayDimCount OleVariant; System.Variants.hpp 判断OleVariant 是否为空 System::OleVariant ov i ...
- boost数据结构variant
variant和any有些类似,是一种可变类型,是对C/C++中union概念的增强和扩展: 普通的union只能持有普通数据类型,而不能持有string.vector等复杂类型,而varian ...
随机推荐
- Web服务器使用基于纯文本表单的身份验证——.net(未完待续)
asp.net 表单验证方式 Asp.net的身份验证有有三种,分别是"Windows | Forms| Passport",其中又以Forms验证用的最多,也最灵活. 根据实际需 ...
- 初识 数据库及Oracle数据库
一.数据库基本概念二.数据库举例三.Oracle特点四.Oracle版本五.安装Oracle注意事项六.SQL简介七.Select语句 一.数据库基本概念 数据库(Database,DB)数据库管理系 ...
- 全局(Global) 与本地(Local)索引的区别
一.定义说明 oracle数据库中,存在多种对象,最常见的表和索引,索引的目的是为了加快查询:oracle建议一个表>2g时,就建议进行分区,分区表的好处此处省略,分区表有维护操作,但是某些维护 ...
- 增加临时表空间组Oracle11g单实例
#需求,测试库与生产库,临时表空间同步一致 #经过查询生产环境,数据库默认临时表空间,为临时表空间组,有三个成员,三个临时表空间,每个临时表空间一个数据文件,自动扩展 #使用临时表空间组的优点,减少不 ...
- input标签(文本域和文件域)
单行文本域: <form> <input type="text" name="..." ....../> </form> 属 ...
- Error Downloading Packages: yum更新出现错误
yum install lrzsz 失败报错: 解决思路: 1:执行yum clean all 清除缓存目录下的软件包及旧的headers: 2:接着执行 yum list 重新列出所有已经安装和可 ...
- PAT-L2-007 家庭房产 (union-find) 小数据 没有什么是暴力解决不了的!!
题目分析: 典型的union-find 算法 想法: 先不着急 union 因为每一个人的房产信息不知道 所以先输入所有信息 同时保留与自己有关系的每一个人 待初始化每一个人的房产信息后,再union ...
- liblinear使用总结
liblinear是libsvm的线性核的改进版本,专门适用于百万数据量的分类.正好适用于我这次数据挖掘的实验. liblinear用法和libsvm很相似,我是用的是.exe文件,利用python的 ...
- 编写一个漂亮的网站 第一课堂 基于vs编辑
前台代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"& ...
- "ERR unknown command 'cluster'"
golang 连接redis 集群提示 "ERR unknown command 'cluster'" redisdb = redis.NewClusterClient(& ...