Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Количество элементов 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо