颜色数组

Array of Colors

我正在尝试使用一组常量颜色。但是 Delphi 一直给我编译错误。我似乎无法弄清楚我做错了什么......

const
  Statuses : array[0..3] of TAlphaColors =
                            (
                              TAlphaColors.Lightgray, //error here: says insert a '(', even though I already have one
                              TAlphaColors.Yellow,
                              TAlphaColors.Limegreen,
                              TAlphaColors.Blue
                             );

您面临的问题是 TAlphaColor.Lightgray,实际上您命名的所有其他 TAlphaColor.XXX 都是序数真常量。而 TAlphaColors 是记录类型。

我们来看看相关定义:

type
  TAlphaColor = type Cardinal;

  TAlphaColorRec = record
  const
    Alpha = TAlphaColor($FF000000);
    Aliceblue = Alpha or TAlphaColor($F0F8FF);
    Antiquewhite = Alpha or TAlphaColor($FAEBD7);
    .... many more color constant omitted
    constructor Create(const Color: TAlphaColor);
    class var ColorToRGB: function (Color: TAlphaColor): Longint;
    case LongWord of
      0:
        (Color: TAlphaColor);
      2:
        (HiWord, LoWord: Word);
      3:
{$IFDEF BIGENDIAN}
        (A, R, G, B: System.Byte);
{$ELSE}
        (B, G, R, A: System.Byte);
{$ENDIF}
  end;

所以常量不是TAlphaColorRec类型。实际上,您无法在属于该记录类型的记录中声明嵌套常量,这是该语言最大的挫败感之一。这些常量是有序的真常量。

请注意,记录本身在记录的变体部分中有数据。感兴趣的字段是 Color 字段。所以,你可以像这样声明你的常量数组:

const
  Statuses : array[0..3] of TAlphaColors = (
    (Color: TAlphaColors.Lightgray),
    (Color: TAlphaColors.Yellow),
    (Color: TAlphaColors.Limegreen),
    (Color: TAlphaColors.Blue)
  );

要是 Embarcadero 有先见之明让我们写出这样的代码就好了:

type
  TMyRecord = record
  public
    const
      MyConst: TMyRecord = ();
  end;