深入研究Variant数组

时间:2010-02-27 18:00:34  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:Variant支持的各种数据类型System单元中定义了合法的Variant类型:{ Variant type codes (wtypes.h) }varEmpty = $0000; { vt_empty 0 }varNull = $0001; { vt_null 1 }varSmallint = $0002; { vt_i2 2 }varInteger = $0003; { vt_i4 3 }varSingle = $0004; { vt_r4 4 }varDouble = $0005; { vt_r8 5 }varCurrency = $0006;...
  正文:Variant数组主要应用于COM,但是我们也不要不在意它的用途,其实可以用它来做很多复杂的应用,这在后面会详细介绍。Variant是一种可以拥有各种数据类型的变量。通常占据16位字节的内存,它的声明和普通变量一样。如下:
Var I:Variant;
I即拥有了Variant支持的各种数据类型
System单元中定义了合法的Variant类型:
{ Variant type codes (wtypes.h) }

varEmpty = $0000; { vt_empty 0 }
varNull = $0001; { vt_null 1 }
varSmallint = $0002; { vt_i2 2 }
varInteger = $0003; { vt_i4 3 }
varSingle = $0004; { vt_r4 4 }
varDouble = $0005; { vt_r8 5 }
varCurrency = $0006; { vt_cy 6 }
varDate = $0007; { vt_date 7 }
varOleStr = $0008; { vt_bstr 8 }
varDispatch = $0009; { vt_dispatch 9 }
varError = $000A; { vt_error 10 }
varBoolean = $000B; { vt_bool 11 }
varVariant = $000C; { vt_variant 12 }
varUnknown = $000D; { vt_unknown 13 }
//varDecimal = $000E; { vt_decimal 14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F = $000F; { undefined 15 } {UNSUPPORTED per Microsoft}
varShortInt = $0010; { vt_i1 16 }
varByte = $0011; { vt_ui1 17 }
varword = $0012; { vt_ui2 18 }
varLongWord = $0013; { vt_ui4 19 }
varInt64 = $0014; { vt_i8 20 }
/ /varWord64 = $0015; { vt_ui8 21 } {UNSUPPORTED as of v6.x code base}
{ if adding new items, update Variants‘ varLast, BaseTypeMap and OpTypeMap }

varStrArg = $0048; { vt_clsid 72 }
varString = $0100; { Pascal string 256 } {not OLE compatible }
varAny = $0101; { Corba any 257 } {not OLE compatible }

// custom types range from $110 (272) to $7FF (2047)
varTypeMask = $0FFF;
varArray = $2000;
varByRef = $4000;
上述统称为Variant的使用值。VarArray表示Variant包含的一个数组,VarByRef则表示Variant拥有的一个数据指针,实际的数据不直接存在Variant中。
如果要想使某个数据类型存在于Variant中,可以这样:
VariantName:=VarType(VariantName) and VarTypeMask
VariantName是Variant变量名,VarType决定存储在Variant中的数据类型,它与and VarTypeMask组合。
例:
var Name: Variant
begin
Name:=’name’;
Name:=1688;
Name:=VarType(Name) and VarTypeMask;
ShowMessage(inttostr(Name));
大家还有一点要注意的是,千万不要将一个数值与一个不能转化的数据进行算法。

创建Variant数组有两个途径。
1. 用VarArrayCreate,它的定义为:
Function VarArrayCreate(Const Bounds:array of Integer;VarType:Integer):Variant
这个函数在System.pass中有完整定义, Const Bounds:array of Integer定义数组的上界和下界,VarType决定数组中存储什么类型的数据。例:
StrArray:=VarArrayCreate([1,5],varstring);
2.用VarArrayOf,定义为:
Function VarArrayOf(Const Values:array of Variant):Variant;
例:
MyArray:=VarArrayOf([1,2,3,4]); 构造4个元素数组;
除了标准定义外,我们还有一个最大的好处就是它可以创建不同类型数值的数组。例:
MyArray:=VarArrayOf([1,2,3,4,’sdr’,600.25]);
这种功能真是非常的好,它可以应用于不同类型的数据算法。非常像记录定义。
计算普通数组边界的标准函数使用High和Low,还可以用VarArrayLowBound和VarArrayHighBound来计算Variant的数组边界,VarArrayDimCount计算数组的维数。建议使用后者。使用Variant数组时会导致性能损失,我们可以使用VarArrayLock和VarArrayUnLock来加速访问。
下面是一个实例:
unit ARRAYPASS;

interface

uses
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Buttons, Grids, DBGrids;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
ADOQuery1: TADOQuery;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure BitBtn1Click(Sender: TObject);
private
procedure InDatabase(Data:Variant;DataSource:Tadoquery);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Procedure Tform1.InDatabase(Data:Variant;DataSource:Tadoquery); 《深入研究Variant数组》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12956.html


关键字:

关于《深入研究Variant数组》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td