![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще по поводу Tlist. Сортировка. [D5, Win2k]
mRodion © (2004-10-08 14:37:00)Господа, огромное Вам спасибо за то, что вы есть и читаете иногда даже полный бред нас новичков...
А вопрос у меня такой:
ИспользуяTlistстрою свой список:
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1097067854&n=0
Хочу реализовать сортировку. Для этого методу Sort списка типаTlistя должен передать в качестве параметра функцию типа
TListSortCompare = function (Item1, Item2: Pointer): Integer;
Почему-то в качестве параметра нельзя передать такую функцию описанную в самом классе, реализующим список (например, в качествеprivateметода классаTMyClassв примере по ссылке выше).
Приходится описывать эту функцию вне класса:
TMyClass = class
private
FMyList:TList
public
procedureAdd (Item:TMyListItem);
procedureDelete (Index:integer);
propertyItems[Index:integer]:TMyListItem readGetItem
end;
functionCompareMyItems (Item1, Item2: Pointer): Integer;
Но тогда если пользователь захочет использовать две копии моего списка, то обе копии будут использовать одну и ту же функцию сравненияCompareMyItems?
Если да, то это не удобно, поскольку в каждой копии класса может быть свой тип сортировки (например по разным полям), и результат сравнения элементов для разных списков может быть разным.
Что делать в этом случае? Можно ли как-нибуть передать в качестве параметра функциюCompareMyItemsописанную внутри класса?
Надеюсь, ясен вопрос, а то что-то слишком длинный получился...
Skier (2004-10-08 15:20:00) [21]хм...а если так TMethod(AObjectProc).Code ?
Reindeer Moss Eater (2004-10-08 15:06:00) [22]type
TListSortCompare = function (Item1, Item2: Pointer): Integer;
TMyClass = class
private
FMyList:TList
fCompFunc : TListSortCompare;
public
procedure Add (Item:TMyListItem);
procedure Delete (Index:integer);
property Items[Index:integer]:TMyListItem read GetItem
property SortFunc : TListSortCompare read fCompFunc write fCompFunc;
end;
KSergey (2004-10-08 14:50:00) [23]В нее передать не получится
Но можно в модуле определить соотв. переменную типа
TMyCompProc = procedure (Item1, Item2: Pointer): Integer of object;
implementation
var
MyCompFunc:TMyCompProc;
Ну и в методе Sort сначала присваивать этой переменной нужный метод класса, а потом вызывать оригинальную Sort.
В CompareMyItems пишем:
function CompareMyItems
begin
Result := MyCompFunc(Item1, Item2);
end;
Вроде ничего особо не напутал....
Суслик (2004-10-08 14:45:00) [24]Ты определись, что ты вообще делаешь. Как мне видится ты несколько непоследовательно подходишь. Это выражается в том, что ты говоришь, что
"то обе копии будут использовать одну и ту же функцию сравнения"
и в тоже время
"то это не удобно, поскольку в каждой копии класса может быть свой тип сортировки".
Определись - пользователь использует одну фукнцию, есно с определенной функциональнсотю, или несколько разных?
Если несколько разных, то пусть сам пользователь и передает функцию сравнения - пусть сравнивает как ему хочется. ЭТо забота пользователя твоего класса.
Если все же речь идет об одной функции, то о каком разном типе сортироваке может идти речь? Я так полагаю, что ты имеешь в виду не совсем произвольный тип сортировки, а один из предопределенных? Если да, то организуй несколько функций. И сам переключайся переключайся между ними.
Reindeer Moss Eater (2004-10-08 14:44:00) [25]А если я имею экземпляр ТЛист никуда ни в какой класс не входящий?
И я хочу его отсортировать.
Мне что повеситься, или писать за каким-то лешим какой-то ненужный мне класс в котором одним из полей будет мой ТЛист?