Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 07.06.2021
Сообщений: 161

Получение имени перечисляемого типа

20.08.2021, 11:45. Показов 5167. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И снова здравствуйте, данная тема не нова, и, в принципе широко обсуждаемая в тырнетах. Но всё-таки для своей задачи я ответа найти не смог. Суть заключается в следующем: у меня существует перечисляемый тип:
Delphi
1
2
TGroupType = (Warm, Cold, Water, Sewage{сточные воды}, Electro);
  TGroupTypes = set of TGroupType;
А также существует виртуальная классовая функция, которая возвращает тип:
Delphi
1
2
3
4
class function TAbstractInterface.ReturnType: TGroupType;
begin
  Result := [];
end;
И есть довольно много модулей, где она переопределена и возвращает один или несколько типов, это не столь важно. Важно, что я пытаюсь добраться до имени возвращаемого\возвращаемых значений с помощью функции GetEnumName таким вот образом:
Delphi
1
2
for var j := low(Interfaces[i].ReturnType) to High(Interfaces[i].ReturnType) do
      if GetEnumName(TypeInfo(Interfaces[i].ReturnType), integer(j)) = ... then
И проблема в том, что компилятор ругается : "E2133 TYPEINFO standard function expects a type identifier". Я так полагаю, проблема в возращаемом типе от функции, TypeInfo её не принимает по каким-то причинам. Она ведь как раз возвращает идентификатор типа, разве я не прав? (скорее всего нет, раз не работает). Рассудите, пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2021, 11:45
Ответы с готовыми решениями:

Получение отображаемого имени службы
Добрый вечер. У меня есть функция "ServiceGetName", которая должна получать отображаемое имя службы, но вместо этого она возвращает nil....

Получение из строки имени и значений параметров
Стоит такая задача: На входе задана строка, где задано название параметра и ряд его значений, разделенные пробелами (и может быть знаками...

Получение имени изображения при наведении мышью
Доброго времени суток, столкнулся с такой проблемой: Есть форма на которой будут случайные изображения (конкретно карты). Мне надо чтобы...

25
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
20.08.2021, 15:06
Лучший ответ Сообщение было отмечено blackspaceghost как решение

Решение

Студворк — интернет-сервис помощи студентам
То не как бы массив, а множество

Delphi
1
2
3
4
5
var xSet: TGroupTypes;
 
xSet:=[]; //пустое
xSet:=[Cold]; //c одного элемента
xSet:=[Cold]+[Water]; //c нескольких
как бы массив в результате функции это вот например:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type TMyArray = array of Integer;
 
function Abc: TMyArray;
begin
  SetLength(Result,2);
  Result[0]:=1;
  Result[1]:=2;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
    s: String;
    x: TMyArray;
begin
  x:=Abc;
  s:='';
  for i:=Low(x) to High(x) do s:=s+IntToStr(x[i])+' ';
  ShowMessage(s);
  SetLength(x, 0);
end;
Добавлено через 10 минут
а в твоем случае как понял нужно определить что входит в результирующее множество

Delphi
1
2
3
4
var j: TGroupType;
 
for j:=Low(TGroupType) to High(TGroupType) do
  if j in xSet then ...  //входит
1
0 / 0 / 0
Регистрация: 07.06.2021
Сообщений: 161
20.08.2021, 15:23  [ТС]
Цитата Сообщение от Аватар Посмотреть сообщение
а в твоем случае как понял нужно определить что входит в результирующее множество
спасибо, заработало!
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
20.08.2021, 15:26
Ну если сделал тип той функции TGroupType то будет конечно ругаться. Я же о функции возвращающей множество TGroupTypes
1
0 / 0 / 0
Регистрация: 07.06.2021
Сообщений: 161
20.08.2021, 15:30  [ТС]
...почти заработало, но уже близко)
0
Модератор
4152 / 2361 / 814
Регистрация: 15.11.2015
Сообщений: 9,490
20.08.2021, 15:31
Ещё раз. Множество (set) это не массив, а набор битов (флагов). Вот ты определил тип:
Delphi
1
TGroupType = (Warm, Cold, Water, Sewage{сточные воды}, Electro);
и потом множество из этого типа:
Delphi
1
TGroupTypes = set of TGroupType;
Потом объявил переменную типа этого множества
Delphi
1
var w: TGroupTypes;
и в этой переменной каждый элемент перечисления TGroupType занимает 1 бит. Всего, переменная занимает 1 байт и в раскладке это будет выглядеть так:
[x, x, x, Electro, Sewage, Water, Cold, Warm].
Слева x - это неиспользуемые биты.

Когда делаем w := [];, то все биты обнуляются. Когда делаем w := w + [Water];, то устанавливается один бит, соответствующий Water, остальные не изменяются. w := w - [Water]; наоборот, обнуляет бит, соответствующий элементу Water.
В общем, это не массив, Low и High у него нет.
1
0 / 0 / 0
Регистрация: 07.06.2021
Сообщений: 161
20.08.2021, 15:59  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Когда делаем w := [];, то все биты обнуляются. Когда делаем w := w + [Water];, то устанавливается один бит, соответствующий Water, остальные не изменяются. w := w - [Water]; наоборот, обнуляет бит, соответствующий элементу Water.
В общем, это не массив, Low и High у него нет
Так стало намного яснее.

Добавлено через 6 минут
Блин, по идее, всё должно работать как часы, и эта конструкция:
Delphi
1
2
3
4
if ComboBox2.ItemIndex = GetEnumValue(TypeInfo(TGroupType), GetEnumName(TypeInfo(TGroupType), ComboBox2.ItemIndex)) then
      for j := low(TGroupType) to high(TGroupType) do
        if j in Interfaces[i].ReturnType then
          ComboBox2.Items.Add(Interfaces[i].GetObjectName);
не исключение.
Но, почему-то, проверка на вхождение типа в возвращаемый массив не проходит( (5-ый интерфейс возвращает в ReturnType = [Electro])

Добавлено через 7 минут
возвращаемое множество* , прошу прощения

Добавлено через 7 минут
Огосподебожемой, всё заработало. Спасибо всем большое, все очень сильно помогли и расширили мои знания по тебе. Лучший ответ выбрал камрада по имени Аватар, так как именно строчка с проверкой вхождения типа во множество позволила добиться желаемого результата. Ещё раз, спасибо всем большое!!!!!!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.08.2021, 15:59
Помогаю со студенческими работами здесь

Получение краткого имени файла (без расширения)
Добрый день, ниже мой код вывода именов фалов в папке, мне нужно вывести и без расширения, но функция ExtractFileName не помогла :umnik: ...

Определить дату следующего дня + квартал(три последовательных месяца типа весна,осень...) с использованием перечисляемого типа.
Определить дату следующего дня + квартал с использованием перечисляемого типа.

вывод множества перечисляемого типа
Кто знает, подскажите,как организовать вывод множества перечисляемого типа!? PROGRAM lab9_2; USES CRT; TYPE lan =...

Обработка данных перечисляемого типа
Помогите ,пожалуйста. Требуется: разработать и отладить программу, в которой описана рассмотренная дата рождения(Моя дата рождения 9.12)...

Ошибка объявления перечисляемого типа (Enum)
Почему в VBA выводит ошибку, тогда как в VB нет???????? Public Enum CodingParam Encrypt Decrypt End Enum ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru