Лазарус – способы получить из перечисления значения
Здравствуйте, ребята! Мы с вами продолжаем осваивать Лазарус. Это прекраснейший язык программирования на подобие Делфи. Вот есть такой тип данных как перечисления. И вот порою из него мы хотим вытянуть значения. И вот вопросик такой веселый. А как это сделать? Сегодня мы на это посмотрим.
В лазарус сделаем стандартный проект. С окном для виндоус. В секцию TYPE заведем наше перечисление. Пусть это будут сезоны года. Осень, Зима, Весна, Лето.
ESeason =
(Autumn, Winter, Spring, Summer);
Способ 1. WriteStr.
Самый простой.
И вот самый простой способ. Это используя WriteStr. В строку пишем нужный нам
элемент типа перечисления.
Var
MySeason:
ESeason;
StrVal:String;
begin
WriteStr(StrVal,MySeason);
Memo1.Lines.Add('MySeason='
+ StrVal);
WriteStr(StrVal,Winter);
Memo1.Lines.Add(Winter='
+ StrVal);
WriteStr(StrVal,ESeason.Spring);
Memo1.Lines.Add('ESeason.Spring='
+ StrVal);
End;
В нашу текстовую переменную StrVal попадают
самые разные значения типа перечисления. Все это можно так делать! Довольно
гибко и вариативно! Обрати внимание, сколько тут возможностей. Можно кинуть и
переменную типа перечисления. Как например, MySeason. Можно передать и один из элементов перечисления прямо
по имени, например Winter.
И можно передать одно из значений перечисления как положено с полным именем.
Тип перечисления и через точку конкретное его значение. Например, ESeason.Spring.
Способ 2. GetEnumName
(), Ord(). Посложнее.
Первым делом в Uses подключаем TypInfo.
И сразу важная деталь. TypeInfo не работает если перечисления
имеют назначенные цифровые значения.
Например, если перечисление задано так:
ESeason2 = (Autumn=1, Winter, Spring, Summer); //typeinfo не
работает когда есть числовые значения!
То есть продолжаем иметь дело с нашим перечислением из
начала. Такое вот будет работать:
ESeason =
(Autumn, Winter, Spring, Summer);
Теперь перейдем к коду. Делается вытягивание значения из перечисления
в несколько этапов.
Подготовительная деталь. Мы получаем через Ord() числовой эквивалент значения.
Ord(MySeason)
Подготовительная деталь. Получаем информацию о нашем
перечислении. Черех TypeInfo.
TypeInfo(ESeason)
И делаем все через оператор преобразования. Переводим в
строковый вариант при помощи GetEnumType
StrVal:=
GetEnumType(TypeInfo(ESeason),Ord(MySeason))
Передаем в GetEnumType тип нашего перечисления. Это ESeason. И числовое значение, которое
нас интересует. Это MySeason.
IntVal:=ord(MySeason);
Пример программы
var
MySeason:ESeason;
IntVal: integer;
StrVal:String;
begin
StrVal:=GetEnumName(TypeInfo(ESeason),ord(MySeason));
Memo1.Lines.Add('MySeason Integer value = '
+IntToStr(IntVal));
Memo1.Lines.Add('MySeason String value = ' + StrVal);
IntVal:=Ord(Winter);
StrVal:=GetEnumName(TypeInfo(ESeason),ord(Winter));
Memo1.Lines.Add('Winter Integer - ' +IntToStr(IntVal));
Memo1.Lines.Add('Winter String - ' +
StrVal);
IntVal:=Ord(ESeason.Spring);
StrVal:=GetEnumName(TypeInfo(ESeason),ord(ESeason.Spring));
Memo1.Lines.Add('ESeason.Spring Integer -
' +IntToStr(IntVal));
Memo1.Lines.Add('ESeason.Spring String - ' +
StrVal);
End;
Способ 3. Через ручное назначение значений. Самый хитрый
способ.
Для этого создадим связку. Как бы идентификаторы пропишем
еще в массив строковый.
Это все еще как константа идет. И с ESeason.
const
MySeasonNames: Array[ESeason] of string =('Autumn','Winter','Spring','Summer');
Напомню что само перечисление выглядит так:
ESeason =
(Autumn, Winter, Spring, Summer);
Мы как бы связываем перечисление со специальным массивом. В
массиве все значения прописаны как строки.
Теперь можем обратиться к этому массиву. Кинув как индекс
массива – значение из перечисления.
Например, так
StrVal:=MySeasonNames[MySeason];
Или так
StrVal:=MySeasonNames[Winter];
Или так
StrVal:=MySeasonNames[ESeason.Spring];
Мы прометили как бы карту массива. Связав ее с элементами
перечисления. Хитрый ход. И теперь обращаемся к нашей карте. Кидая в массив
значения типа перечисления. Индекс массива – это значение из перечисления.
Var
MySeason:ESeason;
IntVal: integer;
StrVal:String;
begin
StrVal:=MySeasonNames[MySeason];
Memo1.Lines.Add('MySeason =' + StrVal);
StrVal:=MySeasonNames[Winter];
Memo1.Lines.Add('Winter - ' + StrVal);
StrVal:=MySeasonNames[ESeason.Spring];
Memo1.Lines.Add('MySeason.Spring - ' +
StrVal);
End;
Вот три таких вот способа! Делфи – это интересно! Давайте
учиться ребята! Я тоже учусь! И все познаю постепенно. Порою трачу много
времени даже на пару строчек кода.
Дима Линк делает ретро видеоигры, приложения, немного музыку, пишет истории, и еще некоторое ретро.
ВЕБСАЙТ: http://www.dimalink.tv-games.ru/home_rus.html
БЛОГЕР: https://dimalinkrus.blogspot.com/
МАСТОДОН: https://mastodon.social/@DimaLinkRus





Комментарии
Отправить комментарий