Перечисления играют далеко не последнюю роль в языке программирования Delphi.
В этой статье речь пойдёт об одной тонкости в работе с перечислениями, которую, к сожалению, в большинстве случаев обходят стороной. Это возможность обращения к элементам перечисления по их порядковым номерам.
Опишем перечисление:
1 2 |
type enum = (A, B, C); |
Для начала, рассмотрим пример «классического» варианта обращения к элементам перечисления в виде простейшего кода с использованием оператора case:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TMainForm.TestBtnClick(Sender: TObject); var num: integer; enm: enum; begin enm := A; case e of A: num := 0; B: num := 1; C: num := 2; end; ShowMessage(IntToStr(num)); end; |
Как обратиться к элементам перечисления по порядковому номеру? На самом деле очень просто. Для наглядности достаточно слегка изменить вышеприведённый пример.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TMainForm.TestBtnClick(Sender: TObject); var num: integer; enm: enum; begin enm := A; case enm of enum(0): num := 0; enum(1): num := 1; enum(2): num := 2; end; ShowMessage(IntToStr(num)); end; |
Результат работы кода, который приведён и в этом и в предыдущем примере, будет одинаковым.
Использование имени типа вместо имени переменной в качестве значения константы выбора обусловлено семантикой перечислений и оператора case. Поэтому, в случае указания имени переменной в место имени типа, компилятор при построении программы выдаст ошибку.
Зачем же нужно обращаться к элементу перечисления по порядковому номеру?
Причин здесь может быть много. Начиная от банального упрощения (вместо «чрезмерно длинного» имени элемента написать «сокращённый вариант», хотя упрощение в данном случае довольно сомнительно (в комментариях меня поправили)) до решения достаточно сложных задач, в том числе по обфускации на уровне исходного кода.
В любом случае, к данной возможности, в прочем как и к любой другой, имеет смысл прибегать только там, где её использование действительно оправдано.
Странно все это. Причин здесь может быть много. Начиная от банального упрощения (вместо «чрезмерно длинного» имени элемента написать «сокращённый вариант») до решения достаточно сложных задач, в том числе по обфускации на уровне исходного кода. enum введен как раз для того, чтобы вместо непонятных цифр (т.н. «магических чисел») писать имена, которые хоть о чем-то скажут. Ну и менять безболезнено тоже. Типа был у вас енам для состояний игры
К сожалению Вы, видимо, просто не до конца поняли смысл представленного кода. Но а если писали