TMessage = packed record
    Msg: Cardinal;
    case Integer of   //这个Integer是哪里来的啊?
      0: (
        WParam: Longint;
        LParam: Longint;
        Result: Longint);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;
这个Tmessage用case定义是什么意思啊,有什么意义啊,区别和其前的记录型有区别?

解决方案 »

  1.   

    [转载]
    ----------------------------
    一个记录类型能拥有变体部分(看起来象case语句),在声明中,变体部分必须跟在其它字段的后面。要声明一个变体记录,使用如下语法:type recordTypeName = record  fieldList1:type1;  fieldListn:typen;case tag : ordinaltypeof  constantList1:(Variant1);  constantListn:(Variantn);end;声明的前面部分(直到关键字case)和标准记录类型一样,声明的其余部分(从case到最后一个可选的分号)称为变体部分,在变体部分1tag是可选的,它可以是任何有效标识符。如果省略了tag,也要省略它后面的冒号。2ordinalType表示一种有序类型。3每个constantList表示一个ordinalType类型的常量,或者用逗号隔开的常量序列。在所有的常量中,一个值不能出现多次。4每个Variant是一个由逗号隔开的、类似于fieldList:type的声明列表,也就是说,Variant有下面的形式:fieldList1:type1;fieldListn:typen;这里,每个fieldList是一个有效标志符,或是由逗号隔开的标志符列表,每个type表示一种类型,最后一个分号是可选的。这些类型不能是长字符串、动态数组、变体类型或接口(都属于动态管理类型),也不能是包含上述类型的结构类型,但它们可以是指向这些类型的指针。变体记录类型语法复杂,但语义却很简单:记录的变体部分包含几个变体类型,它们共享同一个内存区域。你能在任何时候,对任何一个变体类型的任何字段读取或写入,但是,当改变了一个变体的一个字段,又改变了另一个变体的一个字段时,你可能覆盖了自己的数据。如果使用了tag,它就像记录中非变体部分一个额外的字段,它的类型是ordinalType。变体部分有两个目的。1当记录中字段有不同类型数据(一个实例中不需要所有的字段),所以,当创建实例时,没必要为每个字段都分配内存。原因二:可将同一个数据当作不同的类型进行处理,即使在编译器不允许类型转换的场合。比如:在一个变体类型中,它的第一个字段是64位实数,在另一个变体类型中,第一个字段是32位整数,你可以把一个值赋给实数,然后再当作整数来读取它的前32位值。
      

  2.   

    但是tag是无法引用的,对不?
    我试图引用过,没成功
      

  3.   

    To Kevin_Lmx(繁华阅尽)           谢谢,用sizeof后似乎没有得到什么规律,它sizeof后,有什么规律?            为什么有些记录明明赋A的一个值却是B
      

  4.   

    其实你看看这两部分:
    0: 中的: 
    WParam: Longint;
    还有1: 中的:
    WParamLo: Word;
    WParamHi: Word;就知道了。
    Longint所占的空间刚好是两个Word的空间。
    就是说,其实这两个部分在内存中是同一个空间来的。
    你用WParamLo去访问的其实也就是WParam的高8位。
    其它的也一样。
    大概就是这样子了。
      

  5.   

    Var S1,S1:TMessage;  with S1 do
      begin
        Msg:WM_USER;
        WParam:=INTEGER(@ref1);
        LParam:=INTEGER(@ref2);
      end;    with S2 do 
      begin
        Msg:WM_USER;
        WParamLo:Integer(@ref1);
        WParamHi: Integer(@ref2);
        LParamLo: Integer(@ref3);
        LParamHi: Integer(@ref4);
      end;     
      
      

  6.   

    0,1就是共享内存,从中选择一个来用,和C中的union是一样的用法,