![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Множества
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 (включительно).