Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
ВнизКоличество элементов Set свойства Найти похожие ветки
← →
ancot (2005-05-20 21:12) [0]Добрый вечер мастера.Подскажите как узнать количество элементов в свойстве типа множество(например Anchors). С помощью TypInfo удалось получить только строковое представление значения свойства и Integer значение, т.е. биты есть, а сколько битов задействовано неизвестно. (Неоходимо для создания инспектора объектов)
← →
begin...end © (2005-05-20 21:22) [1]var
S: TAnchors;
Num: Integer;
I: TAnchorKind;
begin
Num := 0;
for I := Low(I) to High(I) do
if I in S then
Inc(Num)
end.
← →
ancot (2005-05-20 21:38) [2]Это понятно.Но тип свойства заранее не известен, известно только что это множество.
← →
begin...end © (2005-05-20 21:43) [3]> ancot (20.05.05 21:38) [2]
А размер этого множества в байтах известен?
← →
ancot (2005-05-20 21:48) [4]В байтах известен. Тот-же Anchors имеет четыре элемента [akLeft,akTop,akRight,akBottom] а размер в байтах = 1 т.е. 8 элементов...
← →
begin...end © (2005-05-20 21:56) [5]> ancot (20.05.05 21:48) [4]
var
I, Num: Integer;
S: множество;
begin
Num := 0;
for I := 0 to 8 * SizeOf(S) - 1 do
if PByte(Longword(@S) + I div 8)^ and (1 shl (I mod 8)) <> 0 then
Inc(Num)
end.
← →
Anatoly Podgoretsky © (2005-05-20 22:12) [6]ancot (20.05.05 21:38) [2]
Это как?
← →
ancot (2005-05-20 22:25) [7]
> Anatoly Podgoretsky © (20.05.05 22:12) [6]
после нажатия "+" в инспекторе объектов необходимо развернуть свойство типа множество и отобразить его(свойства) элементы.
Например тот же Anchors акLeft = True
akTop = False
akRight = False
akBottom = True.
Получить значения элементов не представляет труда: (GetOrdProp(Obj, APropInfo)) получаем число в котором включеные биты указывают на элементы со значением True. Но как узнать количество этих элементов ?. Не отображать же в инспекторе все доступные для Set свойств 32 бита.
← →
ancot (2005-05-20 23:55) [8]Неужели нет вариантов ?...
← →
Anatoly Podgoretsky © (2005-05-21 01:09) [9]Тут 4 элемента и это заранее известно.
← →
jack128 © (2005-05-21 01:29) [10]begin...end © (20.05.05 21:56) [5]
Ты даешь гарантию, что в незадействованых битах не будет мусора?? Но помоему ты не тот вопрос отвечаешь.
Мне показалось, что нужно определить количество элементов базовом типе множества. Тогда примерно так:
type
tEnum = (em1, em2, em3);
TSet = set of tEnum;
procedure TForm1.Button1Click(Sender: TObject);
var
ti: PTypeInfo;
begin
ti := TypeInfo(tSet);
ti := GetTypeData(ti).CompType^;
with GetTypeData(ti)^ do
Caption := IntToStr(MaxValue - MinValue + 1);
end;
← →
jack128 © (2005-05-21 01:30) [11]jack128 © (21.05.05 1:29) [10]
количество элементов B базовом типе множества
← →
begin...end © (2005-05-21 08:34) [12]> jack128 © (21.05.05 1:29) [10]
> Ты даешь гарантию, что в незадействованых битах не
> будет мусора??
Гарантий я, конечно, дать не могу, но в D7 мне не удалось воспроизвести ситуацию с наличием мусора.
> Но помоему ты не тот вопрос отвечаешь.
Не знаю. Я подумал именно про количество включённых элементов.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.015 c