谁帮我详细介绍一下varient类型和olevarient类型 大虾们 能帮我详细介绍一下那个类型么??它在内存中是怎么存储的???? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看 Essential Pascal 中的一段http://www.marcocantu.com/EPascal/chinese/ch10var.htm 转帖D2引入了一种强大的数据类型——变体类型Variant。变体类型的引入主要是为了支持OLE自动化,OLE自动化使用了很多Variant类型。Object Pascal是完全集成Variant的唯一型语言,其中Variant可以作为运行时刻动态数据类型,也可以作为编译时刻的静态数据类型,编译器可以识别变体类型。 D3引入了OleVariant的新类型,OleVariant除了能保存与自动化兼容的数据类型外,其他方面和Variant是一样的。 Variant的特性: ①Variant支持所有简单数据类型,但是不能引用Object Pascal对象;也可以引用不规则数组,不规则数组大小是可变的,他的数据元素可以是任何数据类型。 比如: Var V:Variant; Begin V:=’Delphi’; V:=1; V:=123.45; V:=True; V:=CreateOleObject(‘Word.Basic’); End; ②变体类型的结构定义在System单元(自己查看)。 ③Delphi自动分配和释放Variant变量所需的内存。 ④Variant类型转换。Variant和一般的数据类型之间可以强制转换。 Variant(x) //将x强制转换为Variant类型 这里V是Variant类型变量,S为String类型,可以将V转换为简单数据类型: S:=String(V); //显示转换 S:=V; //隐式转换 ⑤Variant的Empty和Null System单元中定义了2种特定的变体常量:Unassigned和Null,对应的VType分别为VarEmpty和VarNull,我们可以把Unassigned和Null赋值给变体类型变量。 警告: 由于变体类型比较灵活,看上去似乎可以代替常规数据类型的用法。但是使用Variant会使程序速度变慢,代码长度增加,另外让程序难以维护。Variant应用多数集中在ActiveX和数据库方面。 在Delphi当中Variant和OleVariant可以认为是完全相同的。内部结构: TVarRec = record { do not pack this record; it is compiler-generated } case Byte of vtInteger: (VInteger: Integer; VType: Byte); vtBoolean: (VBoolean: Boolean); vtChar: (VChar: Char); vtExtended: (VExtended: PExtended); vtString: (VString: PShortString); vtPointer: (VPointer: Pointer); vtPChar: (VPChar: PChar); vtObject: (VObject: TObject); vtClass: (VClass: TClass); vtWideChar: (VWideChar: WideChar); vtPWideChar: (VPWideChar: PWideChar); vtAnsiString: (VAnsiString: Pointer); vtCurrency: (VCurrency: PCurrency); vtVariant: (VVariant: PVariant); vtInterface: (VInterface: Pointer); vtWideString: (VWideString: Pointer); vtInt64: (VInt64: PInt64); end; 抱歉,贴错了一个结构: TVarData = packed record case Integer of 0: (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: HRESULT); 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); ); 1: (RawData: array [0..3] of LongInt); end; 文本中寻找数据的问题 Socket与IOHandler的区别? delphi 中Active组件 如何让程序准确的在某个时间执行操作? 在一个主从表的中,从表的关联COL这么取的主表的关联COL? 如何求两个数组的并集? 哪位Delphi大哥帮我看一下啊 两个高手才能解决的问题! 进来看看吧,是多层应用的范围吗? 我自己的图标为什么不能在元件板上显出来? delphi开发GIS系统selection.style 问一个简单的问题,快进来接分,急,在线等,有答案马上结!
http://www.marcocantu.com/EPascal/chinese/ch10var.htm
D3引入了OleVariant的新类型,OleVariant除了能保存与自动化兼容的数据类型外,其他方面和Variant是一样的。
Variant的特性:
①Variant支持所有简单数据类型,但是不能引用Object Pascal对象;也可以引用不规则数组,不规则数组大小是可变的,他的数据元素可以是任何数据类型。
比如:
Var
V:Variant;
Begin
V:=’Delphi’;
V:=1;
V:=123.45;
V:=True;
V:=CreateOleObject(‘Word.Basic’);
End;
②变体类型的结构定义在System单元(自己查看)。
③Delphi自动分配和释放Variant变量所需的内存。
④Variant类型转换。Variant和一般的数据类型之间可以强制转换。
Variant(x) //将x强制转换为Variant类型
这里V是Variant类型变量,S为String类型,可以将V转换为简单数据类型:
S:=String(V); //显示转换
S:=V; //隐式转换
⑤Variant的Empty和Null
System单元中定义了2种特定的变体常量:Unassigned和Null,对应的VType分别为VarEmpty和VarNull,我们可以把Unassigned和Null赋值给变体类型变量。
警告:
由于变体类型比较灵活,看上去似乎可以代替常规数据类型的用法。但是使用Variant会使程序速度变慢,代码长度增加,另外让程序难以维护。Variant应用多数集中在ActiveX和数据库方面。
内部结构:
TVarRec = record { do not pack this record; it is compiler-generated }
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;
TVarData = packed record
case Integer of
0: (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: HRESULT);
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);
);
1: (RawData: array [0..3] of LongInt);
end;