powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получчить тип переменной enum ?
12 сообщений из 12, страница 1 из 1
Как получчить тип переменной enum ?
    #40130073
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
type
  TOddNumber = (one, three, five);
  TEvenNumber = (two, four, six);

var
  x: TOddNumber;
  y: TEvenNumber;

  var IncOddNumber(a: TOddNumber): TOddNumber;
  begin
    result :=TOddNumber(a + 1);
  end;

  var IncEvenNumber(a: TEvenNumber): TEvenNumber;
  begin
    result := TEvenNumber(a + 1);
  end;

  var IncAnyNumber(a: variant): variant;
  begin
    if a is TEvenNumber then 
      result := TEvenNumber(a + 1)
    else
      result := TOddNumber(a + 1);
  end;

begin
  x := one;
  y := two;

  x := IncOddNumber(x); //three
  y := IncEvenNumber(y); //four
end; 



Нельзя чтоли для enum вытащить тип?
Хочу сделать единую финкцию (у меня этих функций 10-15).
Перегрузка метода не уменьшает количество кода.
Спасибо.
P.S. Инструкция a is TEvenNumber не работает.
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130074
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums,

inc , dec , succ , pred не устраивают?
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130076
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос в другой плоскости. Такой пример неудачный получился.
Как мне в параметр (единый) запихать мой любой enum и потом его достать?
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130077
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums,

Можно дженерик написать.
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130084
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Вопрос в другой плоскости. Такой пример неудачный получился.
Как мне в параметр (единый) запихать мой любой enum и потом его достать?


А как внутри вы хотите работать с любым enum?
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130085
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function TForm1.IncEnum<T>(const aValue: T): T;
begin
  Result := aValue;
end;

  var x := TOddNumber.one;
  x := IncEnum<TOddNumber>(x);

  var x := TOddNumber.one;
  x := IncEnum(x);
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130101
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А тип переменной никак не узнать, получается?

MyNumber = one - канает

А как проверить что MyNumber или array или pointer?
Rtti тут тоже бессильна.

P.S. А жденерики это единственный вариант?

Спасибо
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130106
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Как мне в параметр (единый) запихать мой любой enum и потом его достать?
Какая цель всего этого? Т.к. сами перечисления придуманы для того, чтобы не пихать произвольные константы в целочисленный тип.
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130113
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Вопрос в другой плоскости. Такой пример неудачный получился.
Как мне в параметр (единый) запихать мой любой enum и потом его достать?

Если речь о сериализации то вот тебе костыли:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
TMyParam = record
  ParamType: byte
  ParamValue: integer;
end;

var
  V1: TOddNumber;
  V2: TEvenNumber;
  P: TMyParam;
begin
  P.ParamType:=1;
  P.ParamValue:=integer(TOddNumber.one);

  case P.ParamType of
    1: V1:=TOddNumber(P.ParamValue);
    2: V1:=TEvenNumber(P.ParamValue);
  end; 

  P.ParamType:=2;
  P.ParamValue:=integer(TEvenNumber.four);

  case P.ParamType of
    1: V2:=TOddNumber(P.ParamValue);
    2: V2:=TEvenNumber(P.ParamValue);
  end; 
end;



Ну а для извращенцев есть RTTI.

https://stackoverflow.com/questions/31601707/generic-functions-for-converting-an-enumeration-to-string-and-back
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130117
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
А тип переменной никак не узнать, получается?

MyNumber = one - канает

А как проверить что MyNumber или array или pointer?
Rtti тут тоже бессильна.

P.S. А жденерики это единственный вариант?

Спасибо


Почему не узнать?
Код: pascal
1.
2.
3.
4.
5.
6.
function TForm1.IncEnum<T>(const aValue: T): T;
var
  x: PTypeInfo;
begin
  x := TypeInfo(T);
end;



Код: pascal
1.
2.
  var s := TRttiEnumerationType.GetName<T>(aValue);
  var v := TRttiEnumerationType.GetValue<T>(s);
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130166
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно и без дженериков, но тогда придется передавать TypeInfo в каждом вызове. В любом случае TypeInfo поможет. Если только нет энумов с явно заданными значениями
...
Рейтинг: 0 / 0
Как получчить тип переменной enum ?
    #40130204
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПасибо большое
То что нужно
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получчить тип переменной enum ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]