Лазарус – способы получить из перечисления значения

 


Здравствуйте, ребята! Мы с вами продолжаем осваивать Лазарус. Это прекраснейший язык программирования на подобие Делфи. Вот есть такой тип данных как перечисления. И вот порою из него мы хотим вытянуть значения. И вот вопросик такой веселый. А как это сделать? Сегодня мы на это посмотрим.

В лазарус сделаем стандартный проект. С окном для виндоус. В секцию 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

Комментарии

Популярные сообщения из этого блога

YS Origins – яркие анимашки в трехмерных сценах!

School Freeware – Фри Паскаль и Лазарус уроки

YS - братик играет в Ису!