![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировака с помощью TObjectList [D7, XP]
Константин © (2010-03-05 11:12:00)Скажите пожалуйста возможно ли отсортировать TObjectList, используя метод объекта в роли TListSortCompare. Это нужно для того, чтобы отсортировать индексированные объекты, то есть фактически отсортировать индексы объектов, хранящиеся в TObjectList, а сами объекты оставить нетронутыми в хранилище, являющимся свойством класса, метод которого и хочу использовать для сортировки. В этом методе будут доступны объекты хранилища через их индексы.
MBo (2010-03-05 13:23:00) [41]1. прототип
type TListSortCompare = function (Item1, Item2: Pointer): Integer;
функции сравнения неплохо бы ему соответствовать.
Послабление в проверке типов позволяет объявлять аргументы Integer, но это ни к чему.
2. В функцию сравнения передаются указатели, т.е. для TObjectList - сами объекты
3. Результат функции - не только -1 и +1, при равенстве ключей функция должна возвращать 0, иначе рано или поздно наступишь на грабли.
Игорь Шевченко (2010-03-05 12:43:00) [42]
> а почему не TObjectList
Если один объект в двух списках и каждый список будет удалять объекты, в нем содержащиеся, то объект будет удален дважды и это будет проблемой.
Константин (2010-03-05 12:39:00) [43]
> И не TObjectList, а TList
а почему не TObjectList, какие то проблемы могут возникнуть?
Игорь Шевченко (2010-03-05 12:28:00) [44]
> а как это написать
Хранить во втором списке не индексы, а сами объекты. И не TObjectList, а TList
Константин (2010-03-05 12:25:00) [45]
SOI.Sort(@(TListSortCompare(self.SortByIndexes)))
и так не пашет. Не подскажите как это сделать?
Константин (2010-03-05 12:16:00) [46]
> приведением типа
а как это написать. Пробую так
SOI.Sort(TListSortCompare(@self.SortByIndexes));
Константин (2010-03-05 12:14:00) [47]
> приведением типа
оО точно, сейчас попробую
Константин (2010-03-05 12:12:00) [48]Как вариант вижу создать не просто набор индексов, а набор объектов-индексов, хранящих непосредственно индекс и ссылку на индексируемый объект,тогада в TListSortCompare будет доступ для сравнения, но не хочется как то всё инкапсулировать получше.
Игорь Шевченко (2010-03-05 12:10:00) [49]
> в этом то и вопрос, как сделать
приведением типа
Константин (2010-03-05 12:04:00) [50]
> TListSortCompare - это не метод
ну да, в этом то и вопрос, как сделать. Если я выношу SortByIndexes как правильнго, в функцию, то я же не вижу тогда TMainClass.SO данных. Может можно как то вернуть каким то методом TMainClass объект TListSortCompare ,который будет иметь доступ к полям TMainClass ?
Игорь Шевченко (2010-03-05 11:59:00) [51]TListSortCompare - это не метод
Константин (2010-03-05 11:57:00) [52]может я что то недоделал, пишет на Sort(@имя метода ) Variable required
Константин (2010-03-05 11:56:00) [53]
> а какие в нем объекты ?
приводимые Integer
Игорь Шевченко (2010-03-05 11:54:00) [54]
> TStoredObjectIndexes = class (TObjectList)
> end;
а какие в нем объекты ?
Константин (2010-03-05 11:50:00) [55]
> Храни сортированый список индексов.
не понял. TMainClass должен определять, по каким правилам как бы сортировать TStoredObjects. Соответсвенно с помощью TStoredObjectIndexes он будет обращаться к TStoredObjects как ему надо.
Ega23 (2010-03-05 11:42:00) [56]Храни сортированый список индексов.
Константин (2010-03-05 11:40:00) [57]
> У него же есть стандартный механизм?
я его и использую
Есть хранилище объектов, которое не надо сортировать:
TStoredObjects
Есть индексы, индексирующие объекты в TStoredObjects
TStoredObjectIndexes = class (TObjectList)
end;
Есть класс оперирующий данными
TMainClass = class
SO: TStoredObjects;
SOI: TStoredObjectIndexes
procedure Proc1;
function SortByIndexes(SOI1, SOI2: Integer): Integer;
end;
Есть два метода TMainClass
procedure Proc1;
begin
SOI.Clear;
for i := 0 to SO.Count - 1 do
SOI.Add(TObject(i));
SOI.Sort(@self.SortByIndexes);
end;
function SortByIndexes(SOI1, SOI2: Integer): Integer
begin
Result := IfThen(SO[SOI1].Value < SO[SOI2].Value, -1, 1);
end;
Это приблизительно. Но это не работает. Можно было TStoredObjects унаследовать от TObjectList, но эти объекты надо оставлять в своём порядке жестко.
Ega23 (2010-03-05 11:16:00) [58]э-э-э-э... У него же есть стандартный механизм?