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;
打印运行结果:
感觉很眼熟?
没错,在数据库编程,特别是数据控件和数据中间件开发的时候,使用变体类型,可以显著提高效率。
- Delphi6开发人员指南学习杂记4-变体类型
- delphi6开发人员指南学习杂记1
- Delphi6开发人员指南学习杂记3-字符串
- Delphi6开发人员指南学习杂记2-注释、函数缺省参数、位运算、增减量运算
- 003_《Delphi6开发人员指南》
- Delphi 中的字符串——《Delphi6 开发人员指南》读书笔记
- CKEditor 4 开发人员指南
- 变体类型Variant
- javascript权威指南学习杂记(1210)
- Delphi学习日记----第五课 结构类型,指针类型,变体类型
- 帖]delphi5开发人员指南学习笔记(1)
- 面向 Java 开发人员的 Scala 指南:集合类型
- delphi6
- android学习杂记.4
- 002_《Delphi6应用开发指南》
- 093_《Delphi6实用开发指南》
- 学习delphi6之菜鸟级别
- 泛型学习(可空类型,排序,定义泛型类,变体(协变与抗变))
- Joggler的MeeGo系统移植
- 常用字符串操作函数
- 最近看过的书
- Nokia CEO Stephen Elop’s ‘Burning Platform’ Memo
- android-contentProvide基础例子
- Delphi6开发人员指南学习杂记4-变体类型
- recvfrom 错误 GetLastError() SOCKET_ERROR 100142008年12月23日 星期二 11:48 A.M.int PASCAL FAR recvfrom( SOCK
- c语言socket编程指南 (转)
- jrtplib学习
- 去掉gmail右部和底部的广告
- 05_DXE_Phase
- 团队开发的“软约束”和“硬约束”
- C#判断操作系统类型总结
- Solaris 网络安装 操作系统