子界类型(Subrange types)定义了某种有序类型的一个子集,子界的有序值必须是在别的有序类型中已经定义过的。子界中有序值的索引被基类确定。
它的形式为Low..High。这里Low和High是同一个有序类型的常量表达式,并且Low比High要小。
定义一个子界类型变量,那么赋给该变量的值必须是子界定义范围内的值。
还是举个详细的例子来说明吧。
1、新建一个Console Application;
2、然后输入以下的代码,请仔细关注注释说明。
program Project1;
{$APPTYPE CONSOLE}
usesSysUtils;
constX = 50;Y = 10;
typeScale = 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'; { 字符范围的子界类型}
varSomeNum: 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