linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > Delphi >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·HexToStr函数和StrToHex函数
·Delphi中的进制转换
·delphi轻松设置无边框透明窗体
·delphi第三方控件安装(Ehlib)
·DELPHI组件安装全攻略
·delphi动态创建控件
·开发工具比较Visual C++ VS De
·delphi完整身份证效验程序实例
·delphi中的Format函数详解
·delphi编程获取打印机的打印任
·如何判断文本文件的编码格式
·深入研究Variant数组
·用delphi编写网络游戏的外挂
·Delphi技巧-用户自定义数据类型
·delphi设置控件透明
最新文章
·在应用程序中跟踪MOUSE的坐标
·压缩和修复MS Access 2000文件
·DELPHI 6.0 动画制做
·怎样在Delphi中调用LastError信
·怎样得到主域服务器名称
·怎样利用递归实现删除某一目录
·读出主键下所有项
·如何制作照片底片效果的图像(
·获得Modem的状态
·WebBrowser屏幕滚动的实现,设
·有关字符串处理的小技巧
·Delphi建立键盘鼠标动作纪录与
·Delphi中布尔类型辨析
·DELPHI程序注册码设计
·图形的不规则的Copy
Google
 
深入研究Variant数组
[ 作者:  加入时间:2007-12-03 14:40:20  来自:Linux联盟收集整理 ]
Variant数组主要应用于COM,但是我们也不要不在意它的用途,其实可以用它来做很多复杂的应用,这在后面会详细介绍。Variant是一种可以拥有各种数据类型的变量。通常占据16位字节的内存,它的声明和普通变量一样。如下:3tkLinux联盟
Var I:Variant;3tkLinux联盟
I即拥有了Variant支持的各种数据类型3tkLinux联盟
System单元中定义了合法的Variant类型:3tkLinux联盟
{ Variant type codes (wtypes.h) }3tkLinux联盟
3tkLinux联盟
varEmpty = $0000; { vt_empty 0 }3tkLinux联盟
varNull = $0001; { vt_null 1 }3tkLinux联盟
varSmallint = $0002; { vt_i2 2 }3tkLinux联盟
varInteger = $0003; { vt_i4 3 }3tkLinux联盟
varSingle = $0004; { vt_r4 4 }3tkLinux联盟
varDouble = $0005; { vt_r8 5 }3tkLinux联盟
varCurrency = $0006; { vt_cy 6 }3tkLinux联盟
varDate = $0007; { vt_date 7 }3tkLinux联盟
varOleStr = $0008; { vt_bstr 8 }3tkLinux联盟
varDispatch = $0009; { vt_dispatch 9 }3tkLinux联盟
varError = $000A; { vt_error 10 }3tkLinux联盟
varBoolean = $000B; { vt_bool 11 }3tkLinux联盟
varVariant = $000C; { vt_variant 12 }3tkLinux联盟
varUnknown = $000D; { vt_unknown 13 }3tkLinux联盟
//varDecimal = $000E; { vt_decimal 14 } {UNSUPPORTED as of v6.x code base}3tkLinux联盟
//varUndef0F = $000F; { undefined 15 } {UNSUPPORTED per Microsoft}3tkLinux联盟
varShortInt = $0010; { vt_i1 16 }3tkLinux联盟
varByte = $0011; { vt_ui1 17 }3tkLinux联盟
varWord = $0012; { vt_ui2 18 }3tkLinux联盟
varLongWord = $0013; { vt_ui4 19 }3tkLinux联盟
varInt64 = $0014; { vt_i8 20 }3tkLinux联盟
/ /varWord64 = $0015; { vt_ui8 21 } {UNSUPPORTED as of v6.x code base}3tkLinux联盟
{ if adding new items, update Variants‘ varLast, BaseTypeMap and OpTypeMap }3tkLinux联盟
3tkLinux联盟
varStrArg = $0048; { vt_clsid 72 }3tkLinux联盟
varString = $0100; { Pascal string 256 } {not OLE compatible }3tkLinux联盟
varAny = $0101; { Corba any 257 } {not OLE compatible }3tkLinux联盟
3tkLinux联盟
// custom types range from $110 (272) to $7FF (2047)3tkLinux联盟
varTypeMask = $0FFF;3tkLinux联盟
varArray = $2000;3tkLinux联盟
varByRef = $4000;3tkLinux联盟
上述统称为Variant的使用值。VarArray表示Variant包含的一个数组,VarByRef则表示Variant拥有的一个数据指针,实际的数据不直接存在Variant中。3tkLinux联盟
如果要想使某个数据类型存在于Variant中,可以这样:3tkLinux联盟
VariantName:=VarType(VariantName) and VarTypeMask3tkLinux联盟
VariantName是Variant变量名,VarType决定存储在Variant中的数据类型,它与and VarTypeMask组合。3tkLinux联盟
例:3tkLinux联盟
var Name: Variant3tkLinux联盟
begin3tkLinux联盟
Name:=’name’;3tkLinux联盟
Name:=1688;3tkLinux联盟
Name:=VarType(Name) and VarTypeMask;3tkLinux联盟
ShowMessage(inttostr(Name));3tkLinux联盟
大家还有一点要注意的是,千万不要将一个数值与一个不能转化的数据进行算法。3tkLinux联盟
3tkLinux联盟
创建Variant数组有两个途径。3tkLinux联盟
1. 用VarArrayCreate,它的定义为:3tkLinux联盟
Function VarArrayCreate(Const Bounds:array of Integer;VarType:Integer):Variant3tkLinux联盟
这个函数在System.pass中有完整定义, Const Bounds:array of Integer定义数组的上界和下界,VarType决定数组中存储什么类型的数据。例:3tkLinux联盟
StrArray:=VarArrayCreate([1,5],varstring);3tkLinux联盟
2.用VarArrayOf,定义为:3tkLinux联盟
Function VarArrayOf(Const Values:array of Variant):Variant;3tkLinux联盟
例:3tkLinux联盟
MyArray:=VarArrayOf([1,2,3,4]); 构造4个元素数组;3tkLinux联盟
除了标准定义外,我们还有一个最大的好处就是它可以创建不同类型数值的数组。例:3tkLinux联盟
MyArray:=VarArrayOf([1,2,3,4,’sdr’,600.25]);3tkLinux联盟
这种功能真是非常的好,它可以应用于不同类型的数据算法。非常像记录定义。3tkLinux联盟
计算普通数组边界的标准函数使用High和Low,还可以用VarArrayLowBound和VarArrayHighBound来计算Variant的数组边界,VarArrayDimCount计算数组的维数。建议使用后者。使用Variant数组时会导致性能损失,我们可以使用VarArrayLock和VarArrayUnLock来加速访问。3tkLinux联盟
下面是一个实例:3tkLinux联盟
unit ARRAYPASS;3tkLinux联盟
3tkLinux联盟
interface3tkLinux联盟
3tkLinux联盟
uses3tkLinux联盟
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,3tkLinux联盟
Dialogs, DB, ADODB, StdCtrls, Buttons, Grids, DBGrids;3tkLinux联盟
3tkLinux联盟
type3tkLinux联盟
TForm1 = class(TForm)3tkLinux联盟
BitBtn1: TBitBtn;3tkLinux联盟
ADOQuery1: TADOQuery;3tkLinux联盟
Edit1: TEdit;3tkLinux联盟
Edit2: TEdit;3tkLinux联盟
Edit3: TEdit;3tkLinux联盟
DBGrid1: TDBGrid;3tkLinux联盟
DataSource1: TDataSource;3tkLinux联盟
procedure BitBtn1Click(Sender: TObject);3tkLinux联盟
private3tkLinux联盟
procedure InDatabase(Data:Variant;DataSource:Tadoquery);3tkLinux联盟
{ Private declarations }3tkLinux联盟
public3tkLinux联盟
{ Public declarations }3tkLinux联盟
end;3tkLinux联盟
3tkLinux联盟
var3tkLinux联盟
Form1: TForm1;3tkLinux联盟
3tkLinux联盟
implementation3tkLinux联盟
3tkLinux联盟
{$R *.dfm}3tkLinux联盟
3tkLinux联盟
Procedure Tform1.InDatabase(Data:Variant;DataSource:Tadoquery);3tkLinux联盟
var i:integer;3tkLinux联盟
begin3tkLinux联盟
VarArrayLock(Data);3tkLinux联盟
Try3tkLinux联盟
DataSource.Append;3tkLinux联盟
for i:=1 to 3 do3tkLinux联盟
begin3tkLinux联盟
DataSource.Fields[i].Value:=Data[i];3tkLinux联盟
end;3tkLinux联盟
DataSource.Post;3tkLinux联盟
finally3tkLinux联盟
VarArrayUnlock(Data);3tkLinux联盟
end;3tkLinux联盟
end;3tkLinux联盟
3tkLinux联盟
procedure TForm1.BitBtn1Click(Sender: TObject);3tkLinux联盟
var InputData:variant;3tkLinux联盟
begin3tkLinux联盟
adoquery1.Open;3tkLinux联盟
InputData:=VarArrayCreate([1,3],varvariant);3tkLinux联盟
InputData[1]:=edit1.Text;3tkLinux联盟
InputData[2]:=edit1.Text;3tkLinux联盟
InputData[3]:=edit1.Text;3tkLinux联盟
InDatabase(InputData,ADOquery1);3tkLinux联盟
end;3tkLinux联盟
3tkLinux联盟
end.3tkLinux联盟
3tkLinux联盟
Variant数组的应用是很广的,其功能也非常强大,灵活。除了可以应用COM除,还可以应用数据库等很多地方,不过在使用Variant时会损失性能,不但要注意控制,更重要的是不要用的太多。本程序在Delphi 7调试通过。需要源程序请到我的主页http://www.carcode.6to23.com下载。QQ:156409293 Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息