Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1111144288
Zyb
2005-03-18 14:11
2005.06.06
Вопрос по прокси


1-1116481181
Natalie
2005-05-19 09:39
2005.06.06
Как найти максимальное число ?


1-1116907764
КиТаЯц
2005-05-24 08:09
2005.06.06
notepad (Блокнот ) и Utf8


14-1116372170
Петр
2005-05-18 03:22
2005.06.06
Утечка памяти


1-1116605397
Mr-jack
2005-05-20 20:09
2005.06.06
координаты клика по форме...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский