powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
10 сообщений из 10, страница 1 из 1
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #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
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #39863800
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первую сделал:
Код: pascal
1.
  Result := GetEnumName(TypeInfo(TOrderState), ord(AState));


Осталось придумать вторую.
...
Рейтинг: 0 / 0
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #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
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #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
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #39863805
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!)
...
Рейтинг: 0 / 0
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #39863806
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetEnumValue
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #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
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #39864108
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только учтите что вся эта хрень с RTTI медленно работает, в моем коде такие преобразования критичны, их очень много, поэтому перебор по массиву строк или использование TDictionary<string,TOrderState> будет быстрее. Есть и экстремально быстрые алгоритмы, но они будут довольно пухлые в объеме кода.
...
Рейтинг: 0 / 0
Можно ли упростить процедуры, преобразовав имя элемента перечислимого типа в строку?
    #39864173
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
swame2,

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


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