-
Пишу компонент, хочу сделать у него published-свойство перечислимого типа, чтобы оно отображалось в Инспекторе объектов в виде выпадающего списка. Проблема в том, что Инспектор отображает перечислимый тип только если его элементы нумеруются с нуля и идут по-порядку:
type
TMyEnum = (meFirst, meSecond); TMyEnum = (meFirst = 0, meSecond = 1); TMyEnum = (meFirst = 5, meSecond = 1);
компонент у меня примерно такой:
TMyComponent = class(TComponent)
private
fMyEnum: TMyEnum;
.................
published
property Test: TMyEnum read fMyEnum write fMyEnum;
end;
Как поступить, если в моем перечислимом типе элементы нумеруются произвольным образом??? (я хочу хранить в этом свойстве список системных констант)
-
С таким не сталкивался, но проблему можно обойти: вбить системные константы в массив, а перечислимое свойство использовать в качестве индекса этого массива.
-
> С таким не сталкивался, но проблему можно обойти: вбить > системные константы в массив, а перечислимое свойство использовать > в качестве индекса этого массива.
констант много - 40-50 штук, хотелось бы по-проще.
-
Чем вбивание констант в перечислимый тип проще вбивания их же в массив?
-
Возможен такой вариант TMyEnum1 = (me1,me2,me3,me4,me5,me6);
TMyEnum2 = me3..me6;
-
TMyEnum = (meFirst = 5, meSecond = 1);
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := GetEnumName(TypeInfo(TMyEnum),1);
end; [Error] Unit1.pas(36): Type 'TMyEnum' has no type info
-
{$TYPEINFO ON}
-
> DrPass © (27.03.07 13:07) [6] > {$TYPEINFO ON}
А сам то пробывал ???
-
> Чем вбивание констант в перечислимый тип проще вбивания > их же в массив?
намного проще. Поскольку при использовании массива придется забивать не только массив, но и элементы перечислимого типа, используемые для его индексации. К тому же значения системных констант я задаю сам (стандартного pas-файла нету), а в перечислении очень удобно можно соединить объявление с присваиванием.
const
cFIRST = 5;
cSECOND = 1;
cEND = 4;
type
TMyEnum = (meFirst, meSecond, meEnd);
var
MyArray: array [0..2] of integer = ;
type
TMyEnum = (meFirst = 5, meSecond = 1, meEnd = 4);
> {$TYPEINFO ON}
не помогает, уже пробовал
-
Вариант 1:type
TMyEnum = (meFirst = 5, meSecond = 1, meEnd = 4); Вариант 2:type
TMyEnum = (meFirst, meSecond , meEnd);
const
MyArray: array [TMyEnum] of integer = (5, 1, 4); И какая разница?
-
> Юрий Зотов © (27.03.07 18:20) [9] > Вариант 1:type TMyEnum = (meFirst = 5, meSecond = 1, meEnd > = 4);Вариант 2:type TMyEnum = (meFirst, meSecond , meEnd); > const MyArray: array [TMyEnum] of integer = (5, 1, 4);И > какая разница?
имхо первый вариант занимает меньше памяти и удобочитаемость лучше. Числа в массиве придется каждое комментировать, чтобы при изменении ручками не отсчитывать номера элементов.
Но это конечно мелочи.. Так как хотел похоже не получится. Спасибо всем. Тема закрыта.
-
0leg (26.03.07 19:20) TMyEnum = (meFirst = 5, meSecond = 1); // НЕ ВЫВОДИТСЯ !! им не будет. Для таких типов компилятор не генерирует RTTI, со всеми вытекающимии..
-
> И какая разница?
В убодстве написания и, особено, исправления таких вот структур.
-
> 0leg © (28.03.07 15:21) [10]
Числа в типе тоже придется комментировать. После чего удобочитаемость становится одинаковой.
> homm © (28.03.07 22:30) [12]
Спасибо. :о)
|