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

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

Еще по поводу Tlist. Сортировка. [D5, Win2k]


Страницы:   1 2

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]

А если я имею экземпляр ТЛист никуда ни в какой класс не входящий?
И я хочу его отсортировать.
Мне что повеситься, или писать за каким-то лешим какой-то ненужный мне класс в котором одним из полей будет мой ТЛист?


Страницы:   1 2

Наверх

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