DELPHIVariant变量的使用技巧

上传人:宝路 文档编号:22020517 上传时间:2017-11-25 格式:DOC 页数:8 大小:49.32KB
返回 下载 相关 举报
DELPHIVariant变量的使用技巧_第1页
第1页 / 共8页
DELPHIVariant变量的使用技巧_第2页
第2页 / 共8页
DELPHIVariant变量的使用技巧_第3页
第3页 / 共8页
DELPHIVariant变量的使用技巧_第4页
第4页 / 共8页
DELPHIVariant变量的使用技巧_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《DELPHIVariant变量的使用技巧》由会员分享,可在线阅读,更多相关《DELPHIVariant变量的使用技巧(8页珍藏版)》请在金锄头文库上搜索。

1、DELPHI Variant 变量的使用技巧。delphi 为了完全支持 OLE,32 位 Delphi 增加了 Variant 数据类型,本节将从宏观角度来分析这种数据类型。实际上, Variant 类型对 Pascal 语言有普遍而深入的影响,Delphi 控件库中与 OLE 无关的地方也使用到这种类型。Variant 变量没有类型 一般说来,你可以用 Variant 变量存储任何数据类型,对它执行各种操作和类型转换。需要注意的是:这违反了 Pascal 语言的一贯原则,有悖于良好的编程习惯。variant 变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进

2、一步测试中才能发现。总之,你可以认为包含 variant 变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。上面对 Variant 类型的使用提出了警告,现在来看看 Variant 类型究竟能干什么。基本上说,如果声明了一个 variant 变量:varV: Variant;你就可以把各种不同类型的值赋给它:V := 10;V := Hello, World;V := 45.55;一旦得到一个 variant 值,你可以把它拷贝给任何兼容或不兼容的数据类型。如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行转换,无法转换则颁布一个

3、运行时间错误。实际上,variant 变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。见例 VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的 OnClick 事件代码如下: procedure TForm1.Button1Click(Sender: TObject);varV: Variant;beginV := 10;Edit1.Text := V;V := Hello, World;Edit2.Text := V;V := 45.55;Edit3.Text := V;end;很有趣是不是?你可以把一个值

4、为字符串的 variant 变量赋给编辑框 Text 属性,还可以把值为整数或浮点数的 variant 变量赋给Text 属性。正如你在图 10.1 中所看到的,一切正常。(图 10.1)按 Assign 按钮后,例 VariTest 的输出结果图 10.1: 例 VariTest 的 Assign 按钮 Click 事件输出结果更糟糕的是:你还可以用 variant 变量计算数值,从第二个按钮的 Click 事件代码就可看到这一点:procedure TForm1.Button2Click(Sender: TObject);varV: Variant;N: Integer;beginV :=

5、 Edit1.Text;N := Integer(V) * 2;V := N;Edit1.Text := V;end;至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。这里再重申一遍,如果不到万不得以,不要随便使用 Variant 类型,还是应坚持使用传统的 Pascal 数据类型和类型检查方法。在 Delphi 和 VCL 中,variant 变量主要是用于 OLE 支持和数据库域的访问。Variant 类型内部结构 Delphi 中定义了一个 variant 记录类型,TVarData ,它与 Variant 类型有相同的内存布局。你可以

6、通过 TVarData 访问 variant 变量的实际类型。TVarData 结构中包含了 Variant 类型信息(由 Vtype 域表示)、一些保留域及当前值。VType 域的取值包括 OLE 自动化中的所有数据类型,这些类型通常叫 OLE 类型或 variant 类型。以下是 variant 类型的完整列表,按字母顺序排列:varArray varBoolean varByRef varCurrency varDate varDispatch varDouble varEmpty varError varInteger varNull varOleStr varSingle varSm

7、allint varString varTypeMask varUnknown varVariant 你可以在 Delphi 帮助系统的 variants 主题下找到这些类型的说明。还有许多操作 variant 变量的函数,你可以用它们进行特定的类型转换,或通过它们获取 variant 变量的类型信息(例如 VarType 函数),当你用 variant 变量写表达式时,Delphi 会自动调用这些类型转换和赋值函数。另外还有操作 variant 数组的例程,你可以通过帮助文件的 Variant support routines 主题了解相关内容。Variant 类型运行很慢! Variant

8、 类型代码运行很慢,不仅数据类型转换如此,两个值为整数的 Variant 变量相加也是如此。它们几乎跟 Visual Basic 这种解释性代码一样慢!为了比较 Variant 变量和整型变量的运行速度,请看例 VSpeed 。程序中设置了一个循环,记录运行时间并在进程条中显示运行状态。下面是基于 variant 类型的一段代码,基于整型的代码与此相似:procedure TForm1.Button1Click(Sender: TObject);vartime1, time2: TDateTime;n1, n2: Variant;begintime1 := Now;n1 := 0;n2 :=

9、0;ProgressBar1.Position := 0;while n1 5000000 dobeginn2 := n2 + n1;Inc (n1);if (n1 mod 50000) = 0 thenbeginProgressBar1.Position := n1 div 50000;Application.ProcessMessages;end;end;/ we must use the resultTotal := n2;time2 := Now;Label1.Caption := FormatDateTime (n:ss, Time2-Time1) + seconds;end;记时这

10、段代码值得一看,因为你可以把它用到任何类型的性能测试中。正如你所看到的,程序用 Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分(n) 和秒(ss) 表示。除此之外,你可以用 Windows API 的 GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。图 10.2 是在本人计算机上运行程序看到的结果。当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。Delphi 笔记(整理)-变体 博客分类: 学习笔记 Delphi 数据结构 J#除结

11、构类型和指针外,变体类型能存储其它的任何类型; 变体类型能存储接口,并能通过它使用接口的方法和属性(参考 Object interfaces) ; 变体类型能存储动态数组,也能存储一种特殊的静态数组:变体数组(Variant array) 。 变体类型能和其它变体类型、整数、实数、字符串和布尔值在表达式和赋值语句中混合使用,编译器自动完成类型转换。可以通过自定义来扩展变体类型,从而能存储任意值。比如,你可以定义一个使用索引的变体字符串 类型,或者让它存储特定的类引用、记录或静态数组。自定义变体类型通过 TCustomVariantTyp 的子类 来创建。 所有的变体类型在创建时被初始化为 Un

12、assigned,Null 表示未知或没有数据。 赋空值:VarV:Variant;v:=vaNil;标准函数 VarType 返回变体类型的类型码,常量 varTypeMask 是一个位掩码,用来从 VarType 的返回值 中提取类型码,所以,在下面的例子中 VarType(V) and varTypeMask = varDouble 若 V 包含 Double 或 Double 数组,则它返回 True 在 System 单元定义的 TVarData 记录类型能被用来转换变体类型,并且可以访问它们的内部构造。 VarAsType 和 VarCast 标准例程能用来改变一个 Variant

13、 的内部表示。 除了、is 和 in,所有运算符都可以使用 Variant 作为运算数 对 Variant 的操作返回 Variant 值;若有一个运算数是 Null 则结果为 Null; 若有一个运算数为 Unassigned 则引发异常。 在二元运算中,若只有一个运算数是 Variant,则另一个被转换为 Variant。 不能把一个普通的静态数组赋给 Variant,取而代之的是,通过调用 VarArrayCreate 或 VarArrayOf 两者 之一来创建 Variant 数组。比如, V: Variant; . V := VarArrayCreate(0,9, varIntege

14、r); 要创建字符串类型的 Variant 数组,使用 varOleStr 使用 VarArrayRedim 函数来更改 Variant 数组的大小。其它用于 Variant 数组的标准例程包括 VarArrayDimCount 、VarArrayLowBound 、VarArrayHighBound 、VarArrayRef 、VarArrayLock 和 VarArrayUnlock. 。Variant 和 OleVariant 的主要区别是,Variant 能包含只有当前程序才能理解的数据类型, OleVariant 只包含为 Ole 自动化兼容而定义的数据类型,它说明,这些数据类型能在

15、程序间或通过网络传送, 而不必担心另一端是否知道如何处理它们。 type T1 = Integer; T2 = T1; T3 = Integer; T4 = T2; T1、T2、T3 、T4 和 Integer 都是指的同一种类型。要声明一种不同的类型,在声明中重复 type 关键字。 比如 type TMyInteger = type Integer; 创建了一种新类型 TmyInteger,它和 Integer 不同。 一个类型声明指定一个标志符,来表示一种数据类型。类型声明的语法为 type newTypeName = type 这里,newTypeName 是一个有效的标志符。比如,给

16、定如下的类型声明 type TMyString = string; 你就可以声明变量 var S: TMyString; 同时声明多个变量时不能包括初始化,Variant 和文件类型的变量声明也不能初始化。 如果你没有明确地初始化一个全局变量,编译器把它初始化为 0。相反,不能在声明局部变量时进行初 始化,它们的值是随机的,直到赋给它们一个值。 你可以创建一个新变量,它和另一个变量在内存的同一个位置。要这样做的话,声明这个新变量时在类 型名的后面跟关键字 absolute,后面再跟一个已存在(先前声明)的变量。比如, var Str: string32; StrLen: Byte absolute Str; 指定变量 StrLen 从 Str 的地址开始。因为短字符串的第一个字节包含字符串的长度, StrLen 的值就是 Str 的长度。 使用 absolute 声明时不能初始化变量,也不能组合其它指示字(和 absolute 一同使用) 。 可以调用 GetM

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号