powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Enum to string и обратно
17 сообщений из 42, страница 2 из 2
Enum to string и обратно
    #40042255
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
на 10-ке
Какой именно 10-ке? У меня 10.3.1
kealon(Ruslan)
но пока не видно как он его использует, однозначно утверждать нельзя
Чего еще не видно? Код я показал
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40042322
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
10.2 Update 1

ты лишь модуль привёл, а где использование?

вот твой код

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
program Test;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TClass1<T> = class
  strict private
    class constructor Create;
  public
    class procedure Method; static;
  end;

  TClass2 = class
  strict private
    class constructor Create;
  end;


class constructor TClass1<T>.Create;
begin
  Writeln(ClassName + '.Create');
end;

class procedure TClass1<T>.Method;
begin
  Writeln(ClassName + '.Method');
end;

class constructor TClass2.Create;
begin
  Writeln(ClassName + '.Create');
  TClass1<Byte>.Method;
end;

begin
  TClass2.Create.Destroy;
end.



всё пучком

Код: plaintext
1.
2.
TClass1<System.Byte>.Create
TClass2.Create
TClass1<System.Byte>.Method
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40042611
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
ты лишь модуль привёл, а где использование?
Проверил. Не повторяется. С этим кодом все работает. Странно
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40043175
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
kealon(Ruslan)
ты лишь модуль привёл, а где использование?
Проверил. Не повторяется. С этим кодом все работает. Странно
я тебе и говорю, покажи весь код
полностью модуль где ты это использовал
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40043866
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

Гаджимурадов Рустам> System.TypInfo.AddEnumElementAliases

Ух-ты, круто...



Круто-то круто, но скажем в 10.2 разумно использовать невозможно:
Код: pascal
1.
function GetAliasEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;


не объявлена в интерфейсной секции.

Лучше использовать спец. атрибуты (что-то вроде TEnumAttribute), привязываемые к перечислимому типу:

Код: 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.
  
    TEnumAttribute = class(TCustomAttribute)
    private
        FEnumHint: string;
        FEnumCode: string;
    protected
      function GetEnumCode(): string; virtual;
      procedure SetEnumCode(const AValue: string); virtual;
      function GetEnumHint(): string; virtual;
      procedure SetEnumHint(const AValue: string); virtual;
    protected
        property Code: string read GetEnumCode write SetEnumCode;
        property Hint: string read GetEnumHint write SetEnumHint;
    public
      constructor Create(const ACode: string; const AHint: string = ''); reintroduce; overload; virtual;
      constructor Create(const ACode: byte; const AHint: string = ''); reintroduce; overload; virtual;
      destructor Destroy(); override;
    public
      function Ord<T>(): T; overload;
      function Order<T>(): integer; overload;
    public
        property Code: string read GetEnumCode write SetEnumCode;
        property Hint: string read GetEnumHint write SetEnumHint;
    end;



Можно добавить:


Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
    TEnum<T> = record
    public
    strict private
        FValue: T;
    private
      function GetEnumValue(): T;
      procedure SetEnumValue(const AValue: T);
    public
      class function CodeToHint(ACode: string): string; overload; static;
      class function CodeToOrd(ACode: string): integer; overload; static;
      class function CodeToEnum(ACode: string): T; overload; static;
      class function HintToCode(AHint: string): string; overload; static;
      class function HintToOrd(AHint: string): integer; overload; static;
      class function HintToEnum(AHint: string): T; overload; static;
      class function OrdToHint(AOrd: integer): string; overload; static;
      class function OrdToCode(AOrd: integer): string; overload; static;
      class function OrdToEnum(AOrd: integer): T; overload; static;
    public
      class function CodeToHint(ATypeInfo: PTypeInfo; ACode: string): string; overload; static;
      class function CodeToOrd(ATypeInfo: PTypeInfo; ACode: string): integer; overload; static;
      class function HintToCode(ATypeInfo: PTypeInfo; AHint: string): string; overload; static;
      class function HintToOrd(ATypeInfo: PTypeInfo; AHint: string): integer; overload; static;
      class function OrdToHint(ATypeInfo: PTypeInfo; AOrd: integer): string; overload; static;
      class function OrdToCode(ATypeInfo: PTypeInfo; AOrd: integer): string; overload; static;
    public
      class function EnumToHint(AEnum: T): string; overload; static;
      class function EnumToCode(AEnum: T): string; overload; static;
      class function EnumToOrd(AEnum: T): integer; overload; static;
      class function EnumToName(AEnum: T): string; overload; static;
      class function Instance(AOrder: integer): TClass; overload; static;
      class function Instance(AEnum: T): TClass; overload; static;
      class function Instance(ACode: string): TClass; overload; static;
      class procedure Export(ALIST: TText; const AUseCaption: boolean = true); overload; static;
      class procedure Export(ALIST: TStrings; const AUseCaption: boolean = true); overload; static;
      class procedure Export(ALIST: TcxCustomComboBox; const AUseCaption: boolean = true); overload; static;
//      class procedure Export(ALIST: TcxComboBox); overload; static;
//      class procedure Export(ALIST: TcxDBComboBox); overload; static;
    public
      class operator Implicit(const AValue: integer): TEnum<T>;
      class operator Implicit(const AValue: TEnum<T>): integer;
      class operator Implicit(const AValue: T): TEnum<T>;
      class operator Implicit(const AValue: TEnum<T>): T;
      class operator Implicit(const AValue: string): TEnum<T>;
      class operator Implicit(const AValue: TEnum<T>): string;
    public
      class function GetTypeData(): PTypeData; static;
    public
      class function High(): T; static;
      class function Low(): T; static;
      class function Cast<M>(AValue: T): M; inline; static;
      class function IsEnum(): boolean; inline; static;
    public
      function Instance(): TClass; overload;
        property Value: T read GetEnumValue write SetEnumValue;
    end;



Использование всего этого - что-то вроде такого:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[TEnum('ckCascadeAll','Cascade All')]
[TEnum('ckCascadeMerge','Cascade Merge')]
[TEnum('ckCascadeRefresh','Cascade Refresh')]
[TEnum('ckCascadeRemove','Cascade Remove')]
//------------------------------------------------------------------------------
    TCascadeKind =
      (
          ckCascadeAll
        , ckCascadeMerge
        , ckCascadeRefresh
        , ckCascadeRemove
      );
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40043904
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kapas,

а смысл этой всей городушки, если элементарное SomeDescr[EnumVal] при SomeDescr: array[TEnum] вернет то, что надо
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40043916
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal
kapas,

а смысл этой всей городушки, если элементарное SomeDescr[EnumVal] при SomeDescr: array[TEnum] вернет то, что надо


Вы везде вставляете константы и явно используете глобальные переменные? И не надоедает?

Ведь если звёзды зажигают- значит- это кому то надо...
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044083
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
не объявлена в интерфейсной секции.
В 10.3 объявлена. Может плохо ищете?
kapas
Лучше использовать спец. атрибуты
Если бы атрибуты можно было повесить на само значение. А так, в таком виде, сомнительное удовольствие. Лучше было бы уже делать так
Код: pascal
1.
2.
3.
4.
constructor TEnumAttributes.Create(const AHints: array of string);

[TEnum(['Cascade All', 'Cascade Merge','Cascade Refresh' ,'Cascade Remove'])]
TCascadeKind = (


Fr0sT-Brutal
а смысл этой всей городушки, если элементарное SomeDescr[EnumVal] при SomeDescr: array[TEnum] вернет то, что надо
Вернет. И этот вариант был бы идеален. Если бы не требовалось обратное преобразование. А мостить в кучу мест реализацию IndexOf, причем для разных энумераторов, ну такое...
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044294
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1.
_Vasilisk_В 10.3 объявлена. Может плохо ищете?
Я же четко указал 10.2. Можете убедиться сами.

Видимо забыли это сделать в 10.2., а в 10.3 исправили.
Хм. На самом деле GetAliasEnumValue вызывается из GetEnumValue косвенно. И это работает. Но похоже - нельзя получить по значению сам алиас.
Ну да ладно. Вещь конечно удобная, но я ее использовать пока не собираюсь.
2.
_Vasilisk_Если бы атрибуты можно было повесить на само значение. А так, в таком виде, сомнительное удовольствие.
Что значить на само значение? Можно привести пример?
Вы имели ввиду следующее?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TCascadeKind =
      (
[TEnum('Cascade All')]
          ckCascadeAll
        ,
[TEnum('Cascade Merge')]
        ckCascadeMerge
        ,
[TEnum('Cascade Refresh')]
        ckCascadeRefresh
        ,
[TEnum('Cascade Remove')]
        ckCascadeRemove
      );



3.
_Vasilisk_... Лучше было бы уже делать так
Можно сделать и так:
Код: pascal
1.
[TEnum(['Cascade All', 'Cascade Merge','Cascade Refresh' ,'Cascade Remove'])]


, но это не тоже самое что привязать атрибуты к значениям.
Хотя тут есть нюансы, о которых нужно говорить отдельно. Но это - другая история.

4. Такой "штукой", о которой я писал, пользуюсь с момента появления в Delphi атрибутов и с переходом к новым версиям проблем не было. Это часть других тех. решений (сериализация/десериализация; описатели в элементах управления и др.). Для меня решение которое я набросал вполне удобно в использовании. Я не агитирую - просто показываю одно из возможных решений.
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044310
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kapas
Вы везде вставляете константы и явно используете глобальные переменные? И не надоедает?

Константы вставляю, а при чем тут глобальные переменные, не понял.
_Vasilisk_
Вернет. И этот вариант был бы идеален. Если бы не требовалось обратное преобразование. А мостить в кучу мест реализацию IndexOf, причем для разных энумераторов, ну такое...

А это уже другой вопрос.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function FindStr(const Item: string; const Values: array of string): Integer;
begin
  for Result := Low(Values) to High(Values) do
    if Item = Values[Result] then
      Exit;
  Result := -1;
end;

// Find string representation in array of strings and return T
// Similar to Val(Str) but Text and Values could be arbitrary.
// Returns T(-1) if Text not found
class function TEnum<T>.Find(const Item: string; const Values: array of string): T;
begin
  Result := Val(FindStr(Item, Values), False);
end;
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044320
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S.:
Если
авторВы имели ввиду следующее?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TCascadeKind =
      (
[TEnum('Cascade All')]
          ckCascadeAll
        ,
[TEnum('Cascade Merge')]
        ckCascadeMerge
        ,
[TEnum('Cascade Refresh')]
        ckCascadeRefresh
        ,
[TEnum('Cascade Remove')]
        ckCascadeRemove
      );


Это вы объявить сможете, а использовать, увы - невозможно (см. довольно старое сообщение: https://stackoverflow.com/questions/2134120/delphi-2010-rtti-explore-enumerations).
С того времени ничего не изменилось и вряд ли сейчас разработчики пойдут на то, чтобы реализовать хранение такой RTTI
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044411
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

а что бы просто не написать парсер?

ckCascadeAll -> "Cascade All"

+ для сложных случаев добавили бы отдельный метод установки
TEnum<T>['Name'] := 'Test';

вполне приемлимо

ещё можно такой фокус сделать

Код: pascal
1.
2.
3.
4.
5.
6.
TSomeEnum = 
(
  seOne,
  seSecond,
  seSomeName = seSecond
)
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044442
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
Вы имели ввиду следующее?
Ага. Но тогда атрибут уже достать невозможно. Я в первом сообщении этот вопрос поднимал
Fr0sT-Brutal
А это уже другой вопрос.
Этот вопрос был поднят в самом первом сообщении. А еще там же было написано, что энумераторов много. И на каждый чих передавать массив констант, с вероятностью однажды передать другой массив - это на любителя
kealon(Ruslan)
а что бы просто не написать парсер?
Потому что мой первый вариант с дженериком отлично работает. Причем значительно лучше чем предлагаемые здесь "улучшения и упрощения"
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044508
kapas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По-поводу инициализации: будете прописывать ее в секции инициализации? Что вы например, будете делать при использовании этого вашего реестра в приложении требующего сериализацию/десериализацию?
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044532
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и
_Vasilisk_
kealon(Ruslan)
а что бы просто не написать парсер?
Потому что мой первый вариант с дженериком отлично работает. Причем значительно лучше чем предлагаемые здесь "улучшения и упрощения"
пока у тебя довольно посредственно

  • TEnumAliasesManager<T>.IndexOf - перебор
  • нет проверки использования пока не вызовется хоть одна функция
  • TEnumAliasesManager<T>.Register сложно проверяется
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044557
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kapas
Что вы например, будете делать при использовании этого вашего реестра в приложении требующего сериализацию/десериализацию?
Не понял вопроса вообще. Ну пусть требует. Я не против
kealon(Ruslan)
пока у тебя довольно посредственно
Пока это лучшее, что тут было
kealon(Ruslan)
TEnumAliasesManager<T>.IndexOf - перебор
Вопрос производительности не стоит вот прямо вообще
kealon(Ruslan)
нет проверки использования пока не вызовется хоть одна функция
Какой проверки использования?
kealon(Ruslan)
[li]TEnumAliasesManager<T>.Register сложно проверяется
Даже не знаю что ответить. А где сложность?
...
Рейтинг: 0 / 0
Enum to string и обратно
    #40044629
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
kealon(Ruslan)
пока у тебя довольно посредственно
Пока это лучшее, что тут было
так се утверждение
ИМХО:
  • 22278584 - Лучше, чем ваш вариант, так как декларативный и всё расположено в одном месте, хотя и не решает проблему 3 "проверка и поддержка", но не исключает принципиально и возможность переинициализации потом, как в вашем варианте
  • "Вопрос производительности не стоит вот прямо вообще" - ну ладно, "не стоит и не стоит" хотя мелочь и вообще ничего не стоит сделать
  • Скомплексовав предыдущее с 22274473 сразу решится проблема проверки на этапе запуска. Хотя бы для дебуга это делать стоит, минимальная защита от дурака очень нужна при сопровождении
  • 22279462 - вообще можно избавиться от вторичных описаний в большинстве случаев
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Enum to string и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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