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

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

Сортировака с помощью TObjectList [D7, XP]


Страницы:   1 2 3

Константин ©   (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]

э-э-э-э... У него же есть стандартный механизм?


Страницы:   1 2 3

Наверх

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