Delphi中的变体Variant数组相关函数
1.VarArrayCreate
procedure TForm1.Button1Click(Sender: TObject);
var
V, W : Variant;
i : Integer;
begin
V := VarArrayCreate([1,4], varVariant);
V[1] := 1;
V[2] := '2';
V[3] := True;
V[4] := 4.5;
for i := VarArrayLowBound(V, 1) to VarArrayHighBound(V, 1) do
begin
Memo1.Lines.Add(V[i])
end;
W := VarArrayCreate([1,2, 1,3], varInteger); //二维
end;
注:数组上下线取值函数不能使用Low/High,而是VarArrayLowBound/VarArrayHighBound,其第二个参数为数组维数。
2.VarArrayOf
更快捷的创建变体数组的函数,例如:V := VarArrayOf([1, '2', True, 4.5]);
3.VarArrayRedim
调整变体数组上下限
4.VarArrayDimCount
范围变体数组维数
5.VarArrayLowBound/VarArrayHighBound
返回变体数组上/下限
6.VarArrayLock/VarArrayUnlock
避免运行时刻检查。一般用于初始化一个大数组。
例如:假设已经存在大数组A,现试图复制该数组时使用如下代码:
V := VarArrayCreate([1, 10000], varByte);
for i := 1 to 10000 do
V[i] = A[i];
但是这段代码的性能是有问题的,这样会把大量的时间花费在对Variant数组的初始化上,因为在对每一个元素进行赋值时,都要通过运行时逻辑来检查并判断数据类型的兼容性、每个元素的位置等等。为了避免运行时检查,要用VarArrayLock()函数和VarArrayUnlock()过程。arArrayLock()函数在内存中锁定数组,使数组不再移动和改变大小,并能返回一个指向数组数据的指针。而VarArrayUnlock()过程
用来对VarArrayLock()函数锁定的数组进行解锁,使数组能重新移动或改变大小。在锁定数组后,能用更有效的方法对数组进行初始化,例如用指向数组数据的指针调用Move()过程,下面的代码也对Variant数组进行初始化,但它更有效:
begin
v:=VarArrayCreate([1,10000],varBate);
p:=VarArrayLock(v)
try
move(A,P^,10000);
finally
VarArrayUnlock(v);
end;
end;
7.VarArrayRef
获得variant指向的数据
8.VarIsArray
函数是一个简单的布尔检查函数,如果传递给它的参数是一个Variant数组则返回True,否则返回False.
1.VarArrayCreate()和VarArrayOf()这两个常用就不说了
2.VarArrayRedim()函数能修改variant数组的最高限。
3.VarArrayDimCount()函数返回Variant数组的维数,
4.VarArrayLowBound()和VarArrayHighBound()函数分别返回Variant数组的下边界和上边界。
5.VarArrayLock()和VarArrayUnlock()一般用于初始化一个大数组。
如:
它创建一个有10000字节的Variant数组。假定有另一个相同长度的非Variant类型的数组,并且想
把非variant类型的数组复制到variant类型的数组中去。通常这都是通过用循环语句对variant数组
的单元进行赋值实现的。示例如下:
begin
v:=VarArrayCreate([1,10000],varBate);
fori:=1to10000do
v[i]:=a[i];
end;
上面这段代码的主要问题在于,大量的时间花费在对Variant数组的初始化上,因为在对每一个元
素进行赋值时,都要通过运行时逻辑来检查并判断数据类型的兼容性、每个元素的位置等等。为了避
免运行时检查,要用VarArrayLock()函数和VarArrayUnlock()过程。VarArrayLock()函数在内存中锁
定数组,使数组不再移动和改变大小,并能返回一个指向数组数据的指针。而VarArrayUnlock()过程
用来对VarArrayLock()函数锁定的数组进行解锁,使数组能重新移动或改变大小。在锁定数组后,能
用更有效的方法对数组进行初始化,例如用指向数组数据的指针调用Move()过程,下面的代码也对
Variant数组进行初始化,但它更有效:
begin
v:=VarArrayCreate([1,10000],varBate);
p:=VarArrayLock(v)
try
move(A,P^,10000);
finally
VarArrayUnlock(v);
end;
end;
6.VarArrayRef()获得variant指向的数据
7.VarIsArray()函数是一个简单的布尔检查函数,如果传递给它的参数是一个Variant数组则返回True,否则返回False.
8.VarClear()过程清除Variant变量并将VType域的值设为varEmpty.
9.VarCopy()将Source复制到Dest。
10.VarCast()将一个Variant转换成指定的类型并存储在另一个Variant变量中。
11.VarType()返回指定Variant的varXXX类型代码。
12.VarAsType()跟VarCast()的功能一样。
13.VarIsEmpty()如果一个Variant变量的类型代码是varEmpty则返回True。
14.VarIsNull()判断Variant变量是否包含null值。
15.VarToStr()将一个Variant变量转换成字符串表达式(如果Variant为varEmpty或varNUll则为空字符
串)。
16.VarFromDateTime()返回一个Variant变量,它存放着指定的TDateTime类型的值。
17.VarToDateTime()返回在Variant中的TDateTime类型的值。
Delphi中的变体Variant数组相关函数的更多相关文章
- Delphi 中的结构体与结构体指针
好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...
- Delphi记录record中的变体
program Day4; {$APPTYPE CONSOLE} uses SysUtils, Util in 'Util.pas'; type TPerson = packed record ID ...
- delphi中String 和 动态静态数组
默认string类型为ansiString:有编译开关控制 shortString: strShort : shortString; strShort 大小256字节,可根据sizeof()计算出,s ...
- Hive中创建结构体、数组以及map
ROW FORMAT DELIMITED 分隔符设置开始语句 FIELDS TERMINATED BY:设置字段与字段之间的分隔符 COLLECTION ITEMS TERMINATED BY:设置一 ...
- Delphi 变体数组 Dataset Locate 查找定位
Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec ...
- Delphi中堆栈区别
http://blog.csdn.net/zang141588761/article/details/52838728 Delphi中堆栈区别 2016-10-17 14:49 277人阅读 评论( ...
- 87. 再谈变体型Variant
在85. BASIC和LotusScript中的Variant一文中.我提到了BASIC风格的语言中的变体型Variant.由于下述种种原因.在LotusScript中常常要用到变体型. 1. ...
- Provide Several View Variants for End-Users 为最终用户提供多个视图变体
In this lesson, you will learn how to provide several customized variants of the same View, and allo ...
- .NET C#杂谈(1):变体 - 协变、逆变与不变
0. 文章目的: 介绍变体的概念,并介绍其对C#的意义 1. 阅读基础 了解C#进阶语言功能的使用(尤其是泛型.委托.接口) 2. 从示例入手,理解变体 变体这一概念用于描述存在继承关系的 ...
- 【Visual Lisp】变体与安全数组
(vlax-make-variant) ;;创建一个未初始化的变体 ;;01.整型值变体(setq myvar (vlax-make-variant 10)) ;;创建整型值变体,返回 #<va ...
随机推荐
- Vulhub WebLogic漏洞复现
目录 前言 任意文件上传漏洞(CVE-2018-2894) 管理控制台未授权RCE漏洞(CVE-2020-14882 & CVE-2020-14883) 未授权RCE漏洞(CVE-2023-2 ...
- Impala源代码分析(1)-Impala架构和RPC
Leave a reply Impala总共分为3个组件:impalad, statestored, client/impala-shell.关于这三个组件的基本功能在这篇文章中已经介绍过了. Cli ...
- uni-app项目button组件去不掉的灰色边框爬坑
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app. 坑位 最近在开发个人 ...
- CVE-2023-0461 漏洞分析与利用
PS: 文章首发于补天社区 漏洞分析 tcp_set_ulp里面会分配和设置 icsk->icsk_ulp_data,其类型为 tls_context tcp_setsockopt do_tcp ...
- MeteoInfo-Java解析与绘图教程(二)
MeteoInfo-Java解析与绘图教程(二) 上节说到了数据的简单解析,这节则说简单绘图 绘图的前置最重要的就是GridData,有了它,基本可以直接绘制出来 例如我们先放弃简单的自定义绘图的操作 ...
- 鸿蒙应用开发从入门到入行 - 篇1:HarmonyOS介绍——带你深入理解鸿蒙特性
鸿蒙应用开发从入门到入行 第一天 - HarmonyOS介绍 导读:在本篇文章里,您将了解到HarmonyOS是什么,以及有哪些振奋人心的特性.并且猫林老师会在本篇文章里给出结论:鸿蒙必能蚕食安卓份额 ...
- vue3笔记
如何创建vue3项目 基于 vue 脚手架 npm i @vue/cli -g vue create <project-name> cd <project-name> npm ...
- GraphQL Part VIII: 使用一对多查询
今天,我们引入两个新的实体来处理客户与订单.客户与订单之间是一对多的关系,一个客户可以拥有一个或者多个订单,反过来,一个订单只能被某个客户所拥有. 可以按照 Engity Framework 的约定配 ...
- 中电金信成为开源风险评估与治理技术实验室软件物料清单(SBOM)工作组成员单位
近期,中电金信成功加入国家工业信息安全发展研究中心开源风险评估与治理技术实验室软件物料清单(SBOM)工作组,成为其成员单位,并同步加入"筑链计划"之中. SBOM是Softwar ...
- Specifications动态查询
[前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ...