Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку? / 10 сообщений из 10, страница 1 из 1
19.09.2019, 11:07
    #39863790
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Код: 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.
type
  TOrderState = (stCreating, stCreated, stRequestAdditional, stEstimation, stNegotiations,
                 stWorkingPRV, stRepairSchedulePre, stRV, stRepairSchedule, stWithdraw, stExecList, stFinancialPackage,
                 stGeneralPackage, stClosed);
.................

function StateToString(AState: TOrderState): string;
begin
  case AState of
    stCreating: Result := 'stCreating';
    stCreated: Result := 'stCreated';
    stRequestAdditional: Result := 'stRequestAdditional';
    stEstimation: Result := 'stEstimation';
    stNegotiations: Result := 'stNegotiations';
    stWorkingPRV: Result := 'stWorkingPRV';
    stRepairSchedulePre: Result := 'stRepairSchedulePre';
    stRV: Result := 'stRV';
    stRepairSchedule: Result := 'stRepairSchedule';
    stWithdraw: Result := 'stWithdraw';
    stExecList: Result := 'stExecList';
    stFinancialPackage: Result := 'stFinancialPackage';
    stGeneralPackage: Result := 'stGeneralPackage';
    stClosed: Result := 'stClosed';
    else Result := 'stCreating';
  end;
end;

function StringToState(AString: string): TOrderState;
begin
  if AString = 'stCreating' then Result := stCreating
  else if AString = 'stCreated' then Result := stCreated
  else if AString = 'stRequestAdditional' then Result := stRequestAdditional
  else if AString = 'stEstimation' then Result := stEstimation
  else if AString = 'stNegotiations' then Result := stNegotiations
  else if AString = 'stWorkingPRV' then Result := stWorkingPRV
  else if AString = 'stRepairSchedulePre' then Result := stRepairSchedulePre
  else if AString = 'stRV' then Result := stRV
  else if AString = 'stRepairSchedule' then Result := stRepairSchedule
  else if AString = 'stWithdraw' then Result := stWithdraw
  else if AString = 'stExecList' then Result := stExecList
  else if AString = 'stFinancialPackage' then Result := stFinancialPackage
  else if AString = 'stGeneralPackage' then Result := stGeneralPackage
  else if AString = 'stClosed' then Result := stClosed
  else Result := stCreating;
end;


Можно ли одним движением преобразовать имя элемента перечислимого типа в строку и наоборот?
...
Рейтинг: 0 / 0
19.09.2019, 11:16
    #39863800
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Первую сделал:
Код: pascal
1.
  Result := GetEnumName(TypeInfo(TOrderState), ord(AState));


Осталось придумать вторую.
...
Рейтинг: 0 / 0
19.09.2019, 11:20
    #39863803
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Код: pascal
1.
2.
3.
4.
5.
function StringToState(AString: string): TOrderState;
begin
  for Result := Low(TOrderState) to High(TOrderState) do
    if SameText(GetEnumName(TypeInfo(TOrderState), ord(Result)),AString) then Exit;
end;
...
Рейтинг: 0 / 0
19.09.2019, 11:21
    #39863804
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
uses
	System.TypInfo;
type
  TOrderState = (stCreating, stCreated, stRequestAdditional, stEstimation, stNegotiations,
                 stWorkingPRV, stRepairSchedulePre, stRV, stRepairSchedule, stWithdraw, stExecList, stFinancialPackage,
                 stGeneralPackage, stClosed);

function StateToString(AState: TOrderState): string;
begin
	Result := GetEnumName(TypeInfo(TOrderState), Ord(AState));
end;

function StringToState(AString: string): TOrderState;
begin
	Result := GetEnumValue(TypeInfo(TOrderState), AString);
end;
...
Рейтинг: 0 / 0
19.09.2019, 11:22
    #39863805
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Спасибо!)
...
Рейтинг: 0 / 0
19.09.2019, 11:22
    #39863806
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
GetEnumValue
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.09.2019, 11:26
    #39863810
svnvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
istrebitel
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
uses
	System.TypInfo;
type
  TOrderState = (stCreating, stCreated, stRequestAdditional, stEstimation, stNegotiations,
                 stWorkingPRV, stRepairSchedulePre, stRV, stRepairSchedule, stWithdraw, stExecList, stFinancialPackage,
                 stGeneralPackage, stClosed);

function StateToString(AState: TOrderState): string;
begin
	Result := GetEnumName(TypeInfo(TOrderState), Ord(AState));
end;

function StringToState(AString: string): TOrderState;
begin
	Result := GetEnumValue(TypeInfo(TOrderState), AString);
end;


Во второй еще приведение типа надо сделать:
Код: pascal
1.
	Result := TOrderState(GetEnumValue(TypeInfo(TOrderState), AString));
...
Рейтинг: 0 / 0
19.09.2019, 17:21
    #39864108
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Только учтите что вся эта хрень с RTTI медленно работает, в моем коде такие преобразования критичны, их очень много, поэтому перебор по массиву строк или использование TDictionary<string,TOrderState> будет быстрее. Есть и экстремально быстрые алгоритмы, но они будут довольно пухлые в объеме кода.
...
Рейтинг: 0 / 0
19.09.2019, 18:53
    #39864173
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
swame2,

Кэшируй результаты RTTI через dictionary.
...
Рейтинг: 0 / 0
20.09.2019, 10:47
    #39864439
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
Из значения в строку довольно быстрый, там пробежка по цепочке строковых имен. Хотя, конечно, Names[EnumValue] все равно быстрее. А вот из строки в значение - каждая строка сравнивается через UTF8SameText, на 10-ке это два UTF8ToUnicode и AnsiStrComp *facepalm*. В общем, перебор по массиву с обычным сравнением строк через = (пусть даже предварительно приведенных к нужному регистру) будет быстрее. Словарь имеет смысл на больших объемах имхо, если значений всего пара десятков (как в подавляющем большинстве случаев) простой перебор будет не хуже.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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