PMessage = ^TMessage;
TMessage = packed 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;
解决方案 »
- cxtreelist怎么添加、删除、修改数据
- 有没有哪位用过DBISAM 这个数据库控件的?如何修改表的密码..?
- 老师们帮我看一下这句SQL,提示文件错误!
- 新年将至祝大家工作顺心生活开心
- 来加分了!!!串口转以太网设备在delphi下开发用哪个控件实现多设备对一台PC通讯...
- AdoQuery或者打taset有没有实现象select distinct功能的方法
- 请问怎样改变当前目录到指定的目录?谢谢~
- 如何将数据集内容导出为Excel文件?
- 转载:一个程序员的忏悔录(巨长,慢慢看)
- ADO,一定要重新连接才能得到最新的数据吗?
- tearsfly(快乐的土豆) 进来领分!
- 以下更新数据库的记录,运行时总是报错,提示为:“Line1:Incorrect syntax near '=',请问是什么原因呀
如下,都是可以的:
TRecrodX=packed record
I: integer;
case boolean of
true:(
V1: byte;
V2: Word};
false:(
V3:DWord);
end;
但是Integer或Boolean是系统数据类型标志符;
难道这样不会和系统冲突吗?
而且,怎么判断什么时候用case其中一个分支?
和下面的功能一样吧,我是菜鸟请指正
var
i:integer
begin
case i of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
要声明一个变体记录,使用下面的语法:
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
case tag: ordinalType of
constantList1: (Variant1);
...
constantListn: (Variantn);
end;
声明的前面部分(直到关键字case )和标准记录类型一样,声明的其余部分(从case 到最后一个可选的
分号,)称为变体部分,在变体部分
z tag 是可选的,它可以是任何有效标志符。如果省略了tag ,也要省略它后面的冒号(:)。
ordinalType 表示一种有序类型。
每个constantList 表示一个ordinalType 类型的常量,或者用逗号隔开的常量序列。在所有的常量
中,一个值不能出现多次。
每个Var i an t 是一个由逗号隔开的、类似于fieldList: type 的声明列表,也就是说,Var i a nt 有下面
的形式:
fieldList1: type1;
...
fieldListn: typen;
这里,每个fieldList 是一个有效标志符,或是由逗号隔开的标志符列表,每个type 表示一种类型,
最后一个分号是可选的。这些类型不能是长字符串、动态数组、变体类型或接口(都属于动态管
理类型),也不能是包含上述类型的结构类型,但它们可以是指向这些类型的指针。
变体记录类型语法复杂,但语义却很简单:记录的变体部分包含几个变体类型,它们共享同一个内存区
域。你能在任何时候,对任何一个变体类型的任何字段读取或写入,但是,当你改变了一个变体的一个ഊData types, variables and constants
字段,又改变了另一个变体的一个字段时,你可能覆盖了自己的数据。如果使用了tag ,它就像记录中
非变体部分一个额外的字段,它的类型是ordinalType 。
变体部分有两个目的。首先,假设你想创建这样一个记录:它的字段有不同类型的数据,但你知道,在
一个(记录)实例中你永远不需要所有的字段,比如:
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
这里的想法是,每个雇员或者是年薪,或者是小时工资,但不能两者都有。所以,当你创建一个TEmployee
的实例时,没必要为每个字段都分配内存。在上面的情形中,变体间的唯一区别在于字段名,但更简单
的情况是字段拥有不同的类型。看一下更复杂的例子:
type
TPerson = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Citizen: Boolean of
True: (Birthplace: string[40]);
False: (Country: string[20];
EntryPort: string[20];
EntryDate, ExitDate: TDate);
end; type
TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
TFigure = record
case TShapeList of
Rectangle: (Height, Width: Real);
Triangle: (Side1, Side2, Angle: Real);
Circle: (Radius: Real);
Ellipse, Other: ();
end;
对每个记录类型的实例,编译器分配足够的内存以容纳最大变体类型的所有字段。可选的tag 和
constantLists (像上面例子中的Rectangle 、Triangle 等)对于编译器管理字段没有任何作用,它们只是为
了程序员的方便。
使用变体记录的第二个原因是,你可以把同一个数据当作不同的类型进行处理,即使在编译器不允许类
型转换的场合。比如,在一个变体类型中,它的第一个字段是64 位实数,在另一个变体类型中,第一个
字段是32 位整数,你可以把一个值赋给实数(字段),然后再当作整数来读取它的前32 位值(比如,把
它传给一个需要整数参数的函数)。