在Delphi中定义如下一记录类型
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
小弟不明白的是Salaried的值从何而来??
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
小弟不明白的是Salaried的值从何而来??
就像是c语言里面的union(记不清楚了)
因为是布尔类型,所以值肯定为true或false,如此而已。
这样的记录类型如何使用呢?
e.g
var
te:TEmployee;
te.AnnualSalary:=...
也可以
te.HourlyWage:=...
其实AnnualSalary域和HourlyWage域是重叠在一起的,你想使用那个就使用那个,当然啦,具体使用那一个根据你的程序代码而定了。
TwzExp=record
case Tag:boolean of
True:(x:integer);
false:(y:array[0..3] of char);
end;
end;
e.g.
var
wz:TwzExp;
wz.x:=$41424344;
那么
读取wz.y时
wz.y[0]='A';
wz.y[0]='B';
wz.y[0]='C';
wz.y[0]='D';
同样给wz.y赋值为'ABCD'时
wz.x=$41424344;
因为asc('A')=$41
好久没有写Pascal代码了
以上可能有错,但是可以参考一下
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;Salaried是一逻辑型变量,该变量由TEmployee的实例变量进行维护,可设置为TRUE或FALSE
当设置为TRUE时, TEmployee实例变量会声明一个Currency类型的AnnualSalary变量
当设置为FALSE时,TEmployee实例变量会声明一个Currency类型的HourlyWage变量
当设置为TRUE时, TEmployee实例变量会声明一个Currency类型的AnnualSalary变量
当设置为FALSE时,TEmployee实例变量会声明一个Currency类型的HourlyWage变量如何设置Salaried变量的值呢??
如果你用AnnualSalary变量,它的值就是true ,HourlyWage变量它的值就为false不过这两个变量使用了同一空间,所以使用时要注意
Salaried: Boolean 相当于声明了一个变量(就像是var ...),目的是:通过对Salaried赋值来确定变体部分。
如:
Salaried := True 则记录变为:TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
AnnualSalary: Currency);
语法结构如下:
type recordTypeName = record fieldList1: type1;
...
fieldListn: typen;
case tag: ordinalType of
constantList1: (variant1);
...
constantListn: (variantn);
end;
tag是一个可选项,可以是任何合法的标识符,如果你忽略这个tag,那么直接写
case :ordinalType of 也一样
如:type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;ordinalType 代表了一个序数类型type.
每一个constantList代表序数类型的一个常量值
如:
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;
记录的变体字段部分共享相同的内存空间。
变体类型共享同一块内存。
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
var
employee:Temployee;
begin
employee.Salaried:=true;//存储salaried值
employee.AnnualSalary:=122;
//读出时
if employee.salaried then
write(employee.AnnualSalary)
else
write(employee.HourlyWage);
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;
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;
1 AnnualSalary、HourlyWage放在一起;
2 不管Salaried为true或false,都可以对AnnualSalary、HourlyWage进行读写;
3 Salaried的取值无关紧要;可以省掉,只写case Boolean of就可以;
4 AnnualSalary、HourlyWage前面谁为true、谁为false同样无所谓