Delphi6开发人员指南学习杂记4-变体类型

来源:互联网 发布:黑马程序员 达内 编辑:程序博客网 时间:2024/06/09 23:09

阅读过指南的开头部分,第一印象就是Delphi和C++一样,都是强类型语言,但是变体类型例外。

程序运行期间的数据类型千变万化,有时候在编译期很难决定具体的类型到底是哪个,于是Variant便诞生了。

指南中有一段类似的代码:

var  v : Variant;begin  v := 65535;  v := 'hello world';  v := Pi;  v := True;  v := CreateOleObject('Word.Basic');end;
这看起来很象VB,事实上变体类型的产生正是为了兼容OLE自动化对象。

Variant的结构:

|-----2Bytes-----|-----------------6Bytes------------------|------------------------8Bytes------------------------|

|----数据类型---|------------------NULL------------------|-----------实际数据或指向数据的指针-----------|

该结构可以从System.pas,Variant的封装记录TVarData中查到:

TVarType = Word;  PVarData = ^TVarData;  {$EXTERNALSYM PVarData}  TVarData = packed record    VType: TVarType;    case Integer of      0: (Reserved1: Word;          case Integer of            0: (Reserved2, Reserved3: Word;                case Integer of                  varSmallInt: (VSmallInt: SmallInt);                  varInteger:  (VInteger: Integer);                  varSingle:   (VSingle: Single);                  varDouble:   (VDouble: Double);                  varCurrency: (VCurrency: Currency);                  varDate:     (VDate: TDateTime);                  varOleStr:   (VOleStr: PWideChar);                  varDispatch: (VDispatch: Pointer);                  varError:    (VError: LongWord);                  varBoolean:  (VBoolean: WordBool);                  varUnknown:  (VUnknown: Pointer);                  varShortInt: (VShortInt: ShortInt);                  varByte:     (VByte: Byte);                  varWord:     (VWord: Word);                  varLongWord: (VLongWord: LongWord);                  varInt64:    (VInt64: Int64);                  varString:   (VString: Pointer);                  varAny:      (VAny: Pointer);                  varArray:    (VArray: PVarArray);                  varByRef:    (VPointer: Pointer);               );            1: (VLongs: array[0..2] of LongInt);         );      2: (VWords: array [0..6] of Word);      3: (VBytes: array [0..13] of Byte);  end;  {$EXTERNALSYM TVarData}
除了OLE对象,Variant还可以有更多的用法,例如下面的代码:

var  vstr,vint,vdouble,vdate,vBoolean,va : Variant;  i : Integer;  s : string;begin  vstr := 'hello world';  vint := Integer(65535);  vdouble := Pi;  vdate := Now;  vBoolean := False;  va := VarArrayCreate([0,4],varVariant); //Variant还可以保存数组  va[0] := vstr;  va[1] := vint;  va[2] := vdouble;  va[3] := vdate;  va[4] := vBoolean;  s := '';  for i := 0 to 4 do  begin    s := s + '字段'+IntToStr(i+1)+VarTypeAsText(VarType(va[i]))+': '+string(va[i])+#13#10;  end;  showMessage(s);end;

打印运行结果:


感觉很眼熟?

没错,在数据库编程,特别是数据控件和数据中间件开发的时候,使用变体类型,可以显著提高效率。