从内存的角度来看,$800000确实在Cardinal的范围内。
我认为Cardinal($800000) 类型转换会修复它,但它没有。
Delphi XE7 及更高版本实际上可以正确编译您的代码。
这也失败了,直到 Delphi XE6 出现同样的错误:
const
CardinalArray: array of Cardinal = [257];
我认为原因是 Delphi 编译器将 [257] 视为 set,尽管左侧表明它应该是 array。
这在 XE4 中失败,但在 XE7 及更高版本中编译正常:
program Cardinals;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
const
CardinalArray: array of Cardinal = [257]; // fails until Delphi XE4 with "E1012 Constant expression violates subrange bounds"
const
ANSICOLORS: array of Cardinal = [
$000000,//0
$800000,//1, compilation error starts with this value
$008000,//2
$808000,//3
$000080,//4
$800080,//5
$008080,//6
$D0D0D0,//7
$3F3F3F,//8
$FF0000,//9
$00FF00,//A
$FFFF00,//B
$0000FF,//C
$FF00FF,//D
$00FFFF,//E
$FFFFFF];//F
var
AnsiColor: Cardinal;
begin
try
for AnsiColor in AnsiColors do
Writeln(Format('$%6.6x', [AnsiColor]));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
输出:
$000000
$800000
$008000
$808000
$000080
$800080
$008080
$D0D0D0
$3F3F3F
$FF0000
$00FF00
$FFFF00
$0000FF
$FF00FF
$00FFFF
$FFFFFF
如果您可以使用非动态数组,那么下面的示例适用于 Delphi XE4(我早在 Delphi 2007 就对其进行了测试,对于 XE 及更早版本,您必须将 System.SysUtils 替换为 SysUtils) )。
注意开关:
- 从
array of Cardinal 到array[0..15] of Cardinal
- 从
[ 和] 到( 和)
program Cardinals;
{$APPTYPE CONSOLE}
//{$R *.res}
uses
System.SysUtils;
const
ANSICOLORS: array[0..15] of Cardinal = (
$000000,//0
$800000,//1, compilation error starts with this value
$008000,//2
$808000,//3
$000080,//4
$800080,//5
$008080,//6
$D0D0D0,//7
$3F3F3F,//8
$FF0000,//9
$00FF00,//A
$FFFF00,//B
$0000FF,//C
$FF00FF,//D
$00FFFF,//E
$FFFFFF);//F
var
AnsiColor: Cardinal;
begin
try
for AnsiColor in AnsiColors do
Writeln(Format('$%6.6x', [AnsiColor]));
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.