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定义是什么意思啊,有什么意义啊,区别和其前的记录型有区别?
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定义是什么意思啊,有什么意义啊,区别和其前的记录型有区别?
----------------------------
一个记录类型能拥有变体部分(看起来象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位值。
我试图引用过,没成功
0: 中的:
WParam: Longint;
还有1: 中的:
WParamLo: Word;
WParamHi: Word;就知道了。
Longint所占的空间刚好是两个Word的空间。
就是说,其实这两个部分在内存中是同一个空间来的。
你用WParamLo去访问的其实也就是WParam的高8位。
其它的也一样。
大概就是这样子了。
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;