大虾们 能帮我详细介绍一下那个类型么??
它在内存中是怎么存储的????

解决方案 »

  1.   

    看看 Essential Pascal 中的一段
    http://www.marcocantu.com/EPascal/chinese/ch10var.htm 
      

  2.   

    转帖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和数据库方面。
      

  3.   

    在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;
      

  4.   

    抱歉,贴错了一个结构:
      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;