type
   TMessage = record
     Msg : Cardinal;
     case integer of
       0: (
           WParam : longint;
           LParam : longint;
           Result : longint;)
       1: (
           WParamLo : Word;
           WParamHi : Word;
           LParamLo : Word;
           LParamHi : Word;
           ResultLo : Word;
           ResultHi : Word;);
  end请问上面的类型定义,什么时候分配3个longint,什么时候分配6个word
这样的定义的目的是什么?

解决方案 »

  1.   

    什么时候都是一样的。
    两个Word的长度就是一个Longint的长度。
      

  2.   

    如果理解类型强制转换,就容易理解联合类型~~
    var
      C: Char;
    begin
      C := 'a';
      Byte(C) = 97;
    //在内存里'a'和97有什么区别?它们都是(01100001)~~
    //只要存储空间允许,当成什么类型来处理都可以~~
    //就是说计算机提供给你一个字节,你想用它来保存《无间道III》也是可以的~~
    //保存什么是你的事~~
    end;type
      TByteChar = record
        case Boolean of
          False: (rByte: Byte);
          True: (rChar: Char);
      end;
    var
      vByteChar: TByteChar; //这个类型使用1Byte的存储空间
    begin
      vByteChar.rChar := 'a';
      //此时vByteChar.rByte=97//rChar和rByte用了同一存储空间~~
    end;
      

  3.   

    to: zswangII(伴水清清)(职业清洁工) 
    //
    高人,应用真是精妙!!!!
      

  4.   

    定义成这样的类型总有一定的目的吧,要不干脆用longint就成了BTW://就是说计算机提供给你一个字节,你想用它来保存《无间道III》也是可以的~~怎么做到?^_^
      

  5.   

    chaty:
    你可以用00000000表示不看电影
    00000001表示《无间道III》
    00000010表示《黑客帝国III》
    00000011表示《手机》
    ……
    想看1就买1的光碟去~~
      

  6.   

    目前就是为了方便~~如果这样定义~~
    type
       TMessage = record
         Msg : Cardinal;
         WParam : longint;
         LParam : longint;
         Result : longint;
       end;但需要取得WParam前四个字节的数值就需要使用LoWord(TMessage.WParam)这样的方法~~
    这样使用就简化TMessage.WParamLo了~~还有就是不要管他什么目的,Windows是M$开发的,不是你我~~
    所以你就按这个标准走吧~~
    不高兴也没办法,除非你自己开发一套系统先~~