Почему я не могу использовать переменную в TRecord?

Сомневаюсь в использовании TRecord.

Могу ли я использовать VAR в свойстве записи?

Например:

Моя запись:

TStyleEvalue = record
    ID: Integer;
    Value: TFontStyles;
    Name: String;

  end;

Когда я пытаюсь указать VAR в свойстве Name, как показано ниже:

StylesEvalueArray : array[0..15] of TStyleEvalue = (
    (ID: 00; Value: [];                                        Name: LB_NORMAL),
    (ID: 01; Value: [fsBold];                                  Name: LB_NEGRITO),
    (ID: 02; Value: [fsItalic];                                Name: LB_ITALICO),
    (ID: 03; Value: [fsBold,fsItalic];                         Name: LB_NEGRITO+', '+LB_ITALICO),
    (ID: 04; Value: [fsUnderline];                             Name: LB_SUBLINHADO),
    (ID: 05; Value: [fsBold,fsUnderline];                      Name: LB_NEGRITO+', '+LB_SUBLINHADO),
    (ID: 06; Value: [fsItalic,fsUnderline];                    Name: LB_ITALICO+', '+LB_SUBLINHADO),
    (ID: 07; Value: [fsBold,fsItalic,fsUnderline];             Name: LB_NEGRITO+', '+LB_ITALICO+', '+LB_SUBLINHADO),
    (ID: 08; Value: [fsStrikeOut];                             Name: LB_TACHADO),
    (ID: 09; Value: [fsBold,fsStrikeOut];                      Name: LB_NEGRITO+', '+LB_TACHADO),
    (ID: 10; Value: [fsItalic,fsStrikeOut];                    Name: LB_ITALICO+', '+LB_TACHADO),
    (ID: 11; Value: [fsBold,fsItalic,fsStrikeOut];             Name: LB_NEGRITO+', '+LB_ITALICO+', '+LB_TACHADO),
    (ID: 12; Value: [fsUnderline,fsStrikeOut];                 Name: LB_SUBLINHADO+', '+LB_TACHADO),
    (ID: 13; Value: [fsBold,fsUnderline,fsStrikeOut];          Name: LB_NEGRITO+', '+LB_SUBLINHADO+', '+LB_TACHADO),
    (ID: 14; Value: [fsItalic,fsUnderline,fsStrikeOut];        Name: LB_ITALICO+', '+LB_SUBLINHADO+', '+LB_TACHADO),
    (ID: 15; Value: [fsBold,fsItalic,fsUnderline,fsStrikeOut]; Name: LB_NEGRITO+', '+LB_ITALICO+', '+LB_SUBLINHADO+', '+LB_TACHADO)
  );

Я получаю это сообщение об ошибке:

[Ошибка] FormFontChange.pas (102): ожидается постоянное выражение

Эта ошибка возникает на всех строках этого массива.

Может кто-нибудь мне помочь?

Заранее спасибо.


person pedro.olimpio    schedule 14.03.2016    source источник
comment
В постоянном выражении можно использовать только истинные константы и некоторые другие вещи, см. ссылку, но без переменных и типизированных констант. Если LB_NORMAL - переменная, вы можете ее забыть. Имеет смысл, поскольку переменные обычно не остаются постоянными. <грамм>   -  person Rudy Velthuis    schedule 14.03.2016


Ответы (1)


Вы объявляете типизированную константу. Значения, которые вы используете для типизированной константы, должны быть так называемыми константными выражениями. Документацию можно найти здесь: http://docwiki.embarcadero.com/RADStudio/en/Declared_Constants#Typed_Constants

В данном примере соответствующий раздел охватывает константы записи. В документации говорится:

Чтобы объявить константу записи, укажите значение каждого поля - как fieldName: value, с назначениями полей, разделенными точкой с запятой - в круглых скобках в конце объявления. Значения должны быть представлены постоянными выражениями.

Компилятор сообщает вам, что LB_NORMAL не является постоянным выражением. Мы не знаем, что такое LB_NORMAL, но это должно быть постоянное выражение, совместимое с типом string. Например:

const
  LB_NORMAL = 'foo';

хватит. Или даже:

const
  foo = 'foo';
  bar = 'bar';
  LB_NORMAL = foo + bar;

Как бы вы ни определяли LB_NORMAL, это не постоянное выражение. Возможно, вам потребуется обратиться к документации по постоянным выражениям, чтобы понять, как действовать.

Похоже, вы подразумеваете в тексте, хотя это неясно и, к сожалению, вы не показали, что такое LB_NORMAL, что LB_NORMAL является переменной. Ну, переменная - это не постоянное выражение. Если LB_NORMAL действительно переменная, вам также нужно будет объявить StylesEvalueArray как переменную.

person David Heffernan    schedule 14.03.2016