Поиск:

Ответ в темуСоздание новой темы Создание опроса
> property типа enum 
:(
    Опции темы
math64
Дата 6.2.2009, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Имеется enum:
Код

enum TMyEnum {
me0 = 0,
me1 = 1,
me2 = 2,
me4 = 4
};

В компоненте объявляется свойство:
Код

__property TMyEnum MyEnum  = { read = GetMyEnum, write = SetMyEnum };

Если не назначать значения элементам enum, при редактировании значения свойства выводятся в виде me0 ... me4, а при назначении значений выводяться просто числа.
1. Как сделать редактирование свойства в виде символьных констант?
2. Я хочу сделать возможность вводить значения типа me4|me1, как проще сделать такое? Я делаю вспомогательный класс:
Код

class TMyEnumBits : public TPersistent {
TMyEnum myEnum;
bool __fastcall GetBit(int);
void __fastcall SetBit(int, bool);
__published:
   __property boolean Me1 = { get=GetBit, set = SetBit, index = me1};
   __property boolean Me2 = { get=GetBit, set = SetBit, index = me2};
   __property boolean Me4 = { get=GetBit, set = SetBit, index = me4};
};

PM   Вверх
Rrader
  Дата 6.2.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 13
Всего: 191



math64, через множества (Set) не пробовали?


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
mrbrooks
Дата 6.2.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Если использовать enum для свойства, причем не один его элемент, а их комбинацию используется еще множество (как обычно в Бормане), тогда: 
Код

enum prop{propA, propB, propC, propD, propE};
Set<prop,propA,propE>pr;

pr << propA << propB; // добавление флагов 
pr >> propB // удаление флага propB
pr.Clear(); //очистка множества
bool b = pr.Contains(propA); // есть ли данный элемент во множестве


если же не использовать множество то можно инициализировать перечисление по умолчанию и выполнять над его элементами побитовые операции. Только тут нужно учитывать, что каждый последующий элемент нужно сместить на разряд больше предыдущего
Код

enum prop{propA = 1, propB = 2, propC = 4, propD = 8, propE = 16};


Тогда уже есть смысл выполнять побитовые операции над элементами перечисления.
PM MAIL   Вверх
math64
Дата 6.2.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Да, через Set<> удобнее, второй вопрос решён. Но значения enum должны идти подряд и именовать биты.
А как быть с enum у которого значения идут не подряд?
PM   Вверх
mrbrooks
Дата 6.2.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(math64 @  6.2.2009,  10:34 Найти цитируемый пост)
А как быть с enum у которого значения идут не подряд? 

в смысле? 

не совсем ясно в чем проблема?

Это сообщение отредактировал(а) mrbrooks - 6.2.2009, 10:50
PM MAIL   Вверх
math64
Дата 6.2.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



В первом случае я хочу редактировать не биты enum, а сам enum, у которого значения идут не подряд.
Код

enum TMyEnum {
me9 = 9,
me11 = 11,
me18 = 18
};

можно заменить так:
Код

enum TMyEnum {
me0,
me9,
me11,
me18
};
int GetCode(TMyEnum me) {
switch(me) {
  case me9: return 9;
  case me11: return 11;
  case me18: return 18;
  default:return 0;
}
}
TMyEnum SetCode(int code) {
switch(code) {
  case 9: return me9;
  case 11: return me11;
  case 18: return me18;
  default: return me0;
}
}

Но при этом при добавление элемента в enum нужно не забыть добавить case в switch'и.

Добавлено через 2 минуты и 56 секунд
Использую C++Builder 5.0, возможно в следующих версиях проблем решена.
PM   Вверх
mrbrooks
Дата 6.2.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(math64 @  6.2.2009,  11:03 Найти цитируемый пост)
Но при этом при добавление элемента в enum нужно не забыть добавить case в switch'и.

другого выхода я не вижу. 
PM MAIL   Вверх
math64
Дата 6.2.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 4
Всего: 72



Ещё делал так (ввод произвольной булевской функции 4 аргументов):
Код

enum TLogFunction {
lfZero = 0x0000,
lfOne = 0xFFFF,
lfA = 0xAAAA,
lfB = 0xCCCC,
lfC = 0xF0F0,
lfD = 0xFF00,
lfAndAB = lfA & lfB,
lfOrAB = lfA | lfB,
...
};
class TLogFunctionProperty : public TIntegerProperty
{
public:
  virtual TPropertyAttributes __fastcall GetAttributes (void);
  virtual AnsiString __fastcall GetValue (void);
  virtual void __fastcall GetValues (TGetStrProc Proc);
  virtual void __fastcall SetValue (const AnsiString Value);

  __fastcall TLogFunctionProperty
     (const _di_IFormDesigner ADesigner, int APropCount) :
     TIntegerProperty(ADesigner, APropCount) { }
  __fastcall virtual ~TLogFunctionProperty(void) { }
};

void __fastcall PACKAGE Register ()
{
...
RegisterPropertyEditor(...);
...
}

Можно вводить значения ввиде символьной константы (если такая есть) или в виде шестнадцатиричного числа (если нужна редко встречающаяся функция, для которой нет константы)
Но при переходе на новые версии C++Builder код редактора нужно переделывать.
PM   Вверх
Usya
Дата 7.2.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



math64

Цитата

1. Как сделать редактирование свойства в виде символьных констант?


Посмотри здесь и здесь. Думаю тебе поможет пара функций: GetEnumName и GetEnumValue. smile 

Это сообщение отредактировал(а) Usya - 7.2.2009, 20:13
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.