Главная страница
    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.012 c
1-1116916210
race1
2005-05-24 10:30
2005.06.06
редактор форм


3-1114511707
DSKalugin
2005-04-26 14:35
2005.06.06
paradox password отмычки


14-1116517929
Andy BitOff
2005-05-19 19:52
2005.06.06
Моральная индульгенция


1-1115493894
Slawutich
2005-05-07 23:24
2005.06.06
Подскажите как програмно узнать день, месяц, год


3-1114750485
NewAtoL
2005-04-29 08:54
2005.06.06
DbExpress и DBLookupCombobox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский