![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Количество элементов Set свойства [D5, D6, D7, Win2k, WinXP]
ancot © (2005-05-20 21:12:00)Добрый вечер мастера.Подскажите как узнать количество элементов в свойстве типа множество(например Anchors). С помощью TypInfo удалось получить только строковое представление значения свойства и Integer значение, т.е. биты есть, а сколько битов задействовано неизвестно. (Неоходимо для создания инспектора объектов)
begin...end (2005-05-21 08:34:00) [1]> jack128 © (21.05.05 1:29) [10]
> Ты даешь гарантию, что в незадействованых битах не
> будет мусора??
Гарантий я, конечно, дать не могу, но в D7 мне не удалось воспроизвести ситуацию с наличием мусора.
> Но помоему ты не тот вопрос отвечаешь.
Не знаю. Я подумал именно про количество включённых элементов.
jack128 (2005-05-21 01:30:00) [2]jack128 © (21.05.05 1:29) [10]
количество элементов Bбазовом типе множества
jack128 (2005-05-21 01:29:00) [3]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;
Anatoly Podgoretsky (2005-05-21 01:09:00) [4]Тут 4 элемента и это заранее известно.
ancot (2005-05-20 23:55:00) [5]Неужели нет вариантов ?...
ancot (2005-05-20 22:25:00) [6]
> Anatoly Podgoretsky © (20.05.05 22:12) [6]
после нажатия "+" в инспекторе объектов необходимо развернуть свойство типа множество и отобразить его(свойства) элементы.
Например тот же Anchors акLeft = True
akTop = False
akRight = False
akBottom = True.
Получить значения элементов не представляет труда: (GetOrdProp(Obj, APropInfo)) получаем число в котором включеные биты указывают на элементы со значением True. Но как узнать количество этих элементов ?. Не отображать же в инспекторе все доступные для Set свойств 32 бита.
Anatoly Podgoretsky (2005-05-20 22:12:00) [7]ancot (20.05.05 21:38) [2]
Это как?
begin...end (2005-05-20 21:56:00) [8]> 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.
ancot (2005-05-20 21:48:00) [9]В байтах известен. Тот-же Anchors имеет четыре элемента [akLeft,akTop,akRight,akBottom] а размер в байтах = 1 т.е. 8 элементов...
begin...end (2005-05-20 21:43:00) [10]> ancot (20.05.05 21:38) [2]
А размер этого множества в байтах известен?
ancot (2005-05-20 21:38:00) [11]Это понятно.Но тип свойства заранее не известен, известно только что это множество.
begin...end (2005-05-20 21:22:00) [12]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.