Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получчить тип переменной enum ? / 12 сообщений из 12, страница 1 из 1
27.01.2022, 20:16
    #40130073
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.
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
27.01.2022, 20:22
    #40130074
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
bzums,

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

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


А как внутри вы хотите работать с любым enum?
...
Рейтинг: 0 / 0
27.01.2022, 21:30
    #40130085
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
Код: 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
27.01.2022, 22:56
    #40130101
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
А тип переменной никак не узнать, получается?

MyNumber = one - канает

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

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

Спасибо
...
Рейтинг: 0 / 0
27.01.2022, 23:07
    #40130106
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
bzums
Как мне в параметр (единый) запихать мой любой enum и потом его достать?
Какая цель всего этого? Т.к. сами перечисления придуманы для того, чтобы не пихать произвольные константы в целочисленный тип.
...
Рейтинг: 0 / 0
28.01.2022, 00:33
    #40130113
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
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
28.01.2022, 02:50
    #40130117
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
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
28.01.2022, 10:28
    #40130166
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
Можно и без дженериков, но тогда придется передавать TypeInfo в каждом вызове. В любом случае TypeInfo поможет. Если только нет энумов с явно заданными значениями
...
Рейтинг: 0 / 0
28.01.2022, 11:39
    #40130204
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получчить тип переменной enum ?
СПасибо большое
То что нужно
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получчить тип переменной enum ? / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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