当前位置:物业房屋租赁管理系统平台 > 租房子 >
Delphi使用Socket时出现Invalid Variant Operation错误
时间:2012-10-24 17:45 来源:未知 作者:admin 点击: 次
有时,我们需要使用这样的数据:它们的类型是可变的,或者在编译时它们的类型不能确定。在这种情
况下,一个选择是使用变体类型作为变量或参数,它们可以在运行时改变类型。变体类型提供了更大的
灵活性,但却比普通变量需要更多的内存,并且操作起来更慢。并且,对变体类型的非法使用会导致运
行时错误,而普通变量的此类错误能在编译时被发现。你也可以创建自定义变体类型。
默认情况下,除记录、集合、静态数组、文件、类、类引用和指针外,变体类型能存储任何其它类型的
值。换句话说,除结构类型和指针外,变体类型能存储其它的任何类型;变体类型能存储接口,并能通
过它使用接口的方法和属性(参考Object interfaces);变体类型能存储动态数组,也能存储一种特殊的
静态数组:变体数组(Variant array)。变体类型能和其它变体类型、整数、实数、字符串和布尔值在表
达式和赋值语句中混合使用,编译器自动完成类型转换。
包含字符串的变体类型不能使用索引,也就是说,若V 是一个存储字符串的变体类型,则V[1]会导致运
行时错误。
你可以通过自定义来扩展变体类型,从而能存储任意值。比如,你可以定义一个使用索引的变体字符串
类型,或者让它存储特定的类引用、记录或静态数组。自定义变体类型通过TCustomVariantTyp 的子类
来创建。
变体类型占用16 字节的内存,包含一个类型码和一个值(或指向这个值的指针),值的类型由类型码指
定。所有的变体类型在创建时被初始化为Unassigned,Null 表示未知或没有数据。
标准函数VarType 返回变体类型的类型码,常量varTypeMask 是一个位掩码,用来从VarType 的返回值
中提取类型码,所以,在下面的例子中
VarType(V) and varTypeMask = varDouble
若V 包含Double 或Double 数组,则它返回True(掩码简单地隐藏了第一位,它指示变体类型是否存储
一个数组)。在System 单元定义的TVarData 记录类型能被用来转换变体类型,并且可以访问它们的内部
构造。请参考在线帮助取得VarType 的类型码列表,要注意,在Object Pascal 的未来实现中,可能会添
加新的类型码。
当Variant 和其它类型混用时会发生的一些自动转换。
var
V1, V2, V3, V4, V5: Variant;
I: Integer;
D: Double;
S: string;
begin
V1 := 1; { 整数值}
V2 := 1234.5678; { 实数值}
V3 := 'Hello world!'; { 字符串}
V4 := '1000'; { 字符串}
V5 := V1 + V2 + V4; { 实数值2235.5678}
I := V1; { I = 1 (整数值) }
I := V4; { I = 1000 (整数值) }
end;