依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

限时开通VIP永久会员,可免费下载所有附件
查看: 104|回复: 0

delphi Variant 与 流(TStream)相互转换

[复制链接] |主动推送

1686

主题

1721

帖子

2378

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2378
发表于 2023-9-20 14:57:15 | 显示全部楼层 |阅读模式
delphi Variant 与 流(TStream)相互转换
Variant 与 流(TStream)相互转换代码Variant转TStream
  1. procedure VariantToStream(Stream: TStream; const Value: Variant);
  2. var
  3.   p: Pointer;
  4. begin
  5.   if VarIsNull(Value) or VarIsEmpty(Value) then
  6.     Exit;
  7.   Stream.Size := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1;
  8.   p := VarArrayLock(Value);
  9.   try
  10.     Stream.position := 0;
  11.     Stream.Write(p^, Stream.Size);
  12.     Stream.position := 0;
  13.   finally
  14.     VarArrayUnlock(Value);
  15.   end;
  16. end;
复制代码
TStream转Variant
  1. function StreamToVariant(Stream: TStream): Variant;
  2. var
  3.   p: Pointer;
  4. begin
  5.   if Stream.Size = 0 then
  6.     Exit(Null);
  7.   Result := VarArrayCreate([0, Stream.Size - 1], varByte);
  8.   p := VarArrayLock(Result);
  9.   try
  10.     Stream.position := 0;
  11.     Stream.Read(p^, Stream.Size)
  12.   finally
  13.     VarArrayUnlock(Result);
  14.   end;
  15. end;
复制代码
方法System.Variants.VarArrayLock
  1. function VarArrayLock(const A: Variant): Pointer;
复制代码
锁定变体数组并返回指向数据的指针。

锁定时,无法调整变体数组的大小,任何对VarArrayRedim的调用都会失败。锁定后,变体数组必须在以后使用VarArrayUnlock来解锁。如果 A 给出的变体不是数组,则会引发 EVariantInvalidArgError 异常。

一旦验证变体数组具有正确的边界和维度,就可以使用 VarArrayLock 来直接访问数组数据,从而提高性能。

System.Variants.VarArrayUnlock
  1. procedure VarArrayUnlock(const A: Variant);
复制代码


解锁之前被 VarArrayLock 锁定的变体数组。如果 A 给出的变体不是数组,则会引发 EVariantInvalidArgError 异常。




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|手机版|依星源码资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-2-23 03:50

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表