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

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

Множества


SPeller ©   (2002-05-23 11:58:00) 

Здравствуйте! У меня возник такой вопрос: можно ли сделать множество, содержащее элементы типа Longint aka Integer? Обычным способом типа: Handles:set of longint;не прокатывает, говорит что надо до 256 элементов. Мне надо максимум, чтобы штук 50 элементов было во множестве. Можно ли это сделать, да ещё и чтобы проверять на наличие во множестве было проще чем перебирать эл-ты массива, иначе вопрос отпадёт сам собой?


SPeller   (2002-05-23 15:59:00) [1]

Ну ладно, всем спасибо за советы...


erik   (2002-05-23 14:18:00) [2]

Тоды делай Array of Handle, а после поиск элемента. А множества это совсем другое MyType = (myHandle1, myHandle2, ...myHandleX) до 256. Но тебе это ненужно.


Кулюкин Олег   (2002-05-23 14:14:00) [3]

2 SPeller © (23.05.02 13:17)
MyList.IndexOf(Pointer(MyHandle)) - проверка, есть ли обрабатываемый хэндл среди тех, которые нужны.


SPeller   (2002-05-23 13:17:00) [4]

2Ally © (23.05.02 12:11)

Да что вы говорите?? :-)))


2Кулюкин Олег © (23.05.02 12:50)

Нет. Это для хука, я проверяю, есть ли обрабатываемый хэндл среди тех, которые мне нужны.


PVOzerski   (2002-05-23 13:15:00) [5]

2Ally © (23.05.02 12:08):
Так делать нельзя. Элемент множества set должен быть в диапазоне 0..255.
Если элементов может быть штук 50, то наилучший выход (хотя и не всегда
пригодный для конкретной задачи) - привязать к каждому возможному значению
некий ID в допустимом для set диапазоне b c этим ID работать. А один раз я
ухитрился "почти" упаковать в set"ы тип smallint, но довольно хитрым образом:
сделал set of byte и аrray[0..255]of set of byte. При проверке вхождения элемента
в этот квази-set я проверял вхождение младшего байта в 1-й set, а старшего - в
set-элемент массива с индексом, равным младшему байту. Понятно, что такой
подход к 32-разрядным элементам приведет к возникновению очень громоздких
конструкций.


Кулюкин Олег   (2002-05-23 12:50:00) [6]

2 SPeller © (23.05.02 11:58)
Может лучше хранить их в списке (TList)?


Ally   (2002-05-23 12:11:00) [7]

В дополнение из хелпа про чтобы проверять на наличие во множестве:

The in operator tests set membership:

if "a" in MySet then ... { do something };
Every set type can hold the empty set, denoted by [].


Ally   (2002-05-23 12:08:00) [8]

Лучше сделать так:


...
type THandlesSet = set of Byte; {или = set of 1..51}
var HandlesSet: THandlesSet;
begin
...
HandlesSet := [Handle, Button1.Handle, Edit1.Handle]
...
end;
...


Конструкция set of 1..51подразумевает, из какого количества элементов - of values of the same ordinal type- состоит набор.


Внук   (2002-05-23 12:07:00) [9]

Дело не в количестве. Множества могут базироваться только на том типе, значения функции Ord от элементов которого лежит между 0 и 255 (включительно).


Наверх

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