arraysdelphigenericsconstantsdelphi-12-athens

How to create a constant generic array of strings with other constants in Delphi? (Error: Constant expression expected)


This answer shows that you can create a constant generic array of strings. So this code works:

const AllTestJSON: TArray<String> = [
  '''
    [
      {'Computer Webcam', TAlphaColors.Aliceblue},
      {'Computer Monitor', TAlphaColors.Blueviolet},
      {'Computer Mouse', TAlphaColors.Aqua},
      {'Computer Keyboard', TAlphaColors.Blue},
    ]
  ''',
  '''
    [
      {'External Harddrive', TAlphaColors.Brown},
      {'USB Hub', TAlphaColors.Chartreuse},
      {'Computer Mousepad', TAlphaColors.Crimson}
    ]
  ''',
  '''
    [
      {'Computer Mouse', TAlphaColors.Aqua},
      {'Computer Keyboard', TAlphaColors.Blue},
      {'External Harddrive', TAlphaColors.Brown},
    ]
  '''
];

But I don't want a normal array of strings. I want an array of strings with constants like this:

const Test1: String = '''
  [
    {'Computer Webcam', TAlphaColors.Aliceblue},
    {'Computer Monitor', TAlphaColors.Blueviolet},
    {'Computer Mouse', TAlphaColors.Aqua},
    {'Computer Keyboard', TAlphaColors.Blue},
  ]
''';
const Test2: String = '''
  [
    {'External Harddrive', TAlphaColors.Brown},
    {'USB Hub', TAlphaColors.Chartreuse},
    {'Computer Mousepad', TAlphaColors.Crimson}
  ]
''';
const Test3: String = '''
  [
    {'Computer Mouse', TAlphaColors.Aqua},
    {'Computer Keyboard', TAlphaColors.Blue},
    {'External Harddrive', TAlphaColors.Brown},
  ]
''';
const AllTestJSON: TArray<String> = [Test1, Test2, Test3];

That however doesn't work and results in the error:

Constant expression expected

Is there a way to do what I am trying to do? I want my strings to be in constants and then put those constants into my array constant.


Solution

  • Remove the : string parts on the individual string constants, making them be true constants instead of typed constants. True constants are more widely accepted; for instance, they can be used in "constant expressions", while typed constants can not.

    const Test1 = '''
      [
        {'Computer Webcam', TAlphaColors.Aliceblue},
        {'Computer Monitor', TAlphaColors.Blueviolet},
        {'Computer Mouse', TAlphaColors.Aqua},
        {'Computer Keyboard', TAlphaColors.Blue},
      ]
    ''';
    
    const Test2 = '''
      [
        {'External Harddrive', TAlphaColors.Brown},
        {'USB Hub', TAlphaColors.Chartreuse},
        {'Computer Mousepad', TAlphaColors.Crimson}
      ]
    ''';
    
    const Test3 = '''
      [
        {'Computer Mouse', TAlphaColors.Aqua},
        {'Computer Keyboard', TAlphaColors.Blue},
        {'External Harddrive', TAlphaColors.Brown},
      ]
    ''';
    
    const AllTestJSON: TArray<string> = [Test1, Test2, Test3];