子界类型(Subrange types)定义了某种有序类型的一个子集,子界的有序值必须是在别的有序类型中已经定义过的。子界中有序值的索引被基类确定。
它的形式为Low..High。这里Low和High是同一个有序类型的常量表达式,并且Low比High要小。
定义一个子界类型变量,那么赋给该变量的值必须是子界定义范围内的值。
还是举个详细的例子来说明吧。
1、新建一个Console Application;
2、然后输入以下的代码,请仔细关注注释说明。
program Project1; {$APPTYPE CONSOLE} uses SysUtils; const X = 50; Y = 10; type Scale = 2 * (X - Y)..(X + Y) * 2; { 常量表达式} //Scale = (X - Y) * 2..(X + Y) * 2; { 此句声明和上面的low..high范围是一样,但是注释掉的这句会导致编译错误。 在任何类型声明中,等号(=)后面如果是左圆括号((),编译器则会认为是枚举类型, 依次上面声明不是枚举的话就会出错,避免声明不是枚举类型时,左圆括号出现在等号后面} TColors = (Red, Blue, Green, Yellow, Orange, Purple, White, Black); { 枚举} TMyColors = Green..White; { 定义一个子界类型,范围为枚举中的Green到White} {TMyColors包括了Green, Yellow, Orange, Purple, White} TSomeNumbers = -128..127; { 数字范围的子界类型} TCaps = 'A'..'Z'; { 字符范围的子界类型} var SomeNum: 1..500; { 也可直接定义子界类型变量} MyColors: TMyColors; SomeNumbers: TSomeNumbers; Caps: TCaps; Letter: Char; begin //Caps := 'e'; { 此句将导致编译错误“Constant expression violates subrange bounds”超出范围} Letter := 'e'; Caps := Letter; { 以上两句可以通过编译,但是运行下面的注释掉的代码也会出现错误,超出子界的范围} //Writeln('Caps在TCaps中的索引为:' + IntToStr(Ord(Caps))); MyColors := Green; Writeln('Green在TMyColor中的索引为:' + IntToStr(Ord(MyColors))); Readln; end.
3、F9运行后,我们来验证结果,结果如下:
以上代码均在Delphi7中测试通过,示例代码下载:20111224子界类型(Subrange_types).rar