Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

Количество элементов 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
14-1116215298
Crusider
2005-05-16 07:48
2005.06.06
Я тут вьювер картинок мультиформатный забацал можете потестить?


11-1098848088
DmiSb
2004-10-27 07:34
2005.06.06
Параметры страницы при печати из KOLWebBrowser


4-1113402764
_Okey_
2005-04-13 18:32
2005.06.06
Как изменить свойства обекта по ходу выполнения проги


14-1116400799
DelphiN!
2005-05-18 11:19
2005.06.06
Отправка служебных комманд на чековый принтер Samsung SRP350


4-1113482304
_AndreW_
2005-04-14 16:38
2005.06.06
Можно ли управлять чужим приложением, используя его же классы?