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

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

CustomSort в Tstringlist [D5, Win2k, WinXP]


Smok_er ©   (2002-06-06 00:03:00) 

Уважаемые мастера!
Искал по всему архиву форума ответ, но ничего не нашел.
Есть небольшая проблема с сортировкой сабжа.
Создаем класс, к примеру
type TClass1 = class
public
Var1: Integer;
Var2: String;
end;



объявляем его
Class1: TClass1
Затем заносим в стринглист и пытаемся отсортировать методом customsort.
Привожу пример:

function SizeCustomSort(List: TStringList; Index1, Index2: Integer): Integer;
var
R1, R2: Integer;
begin
R1:= TClass1(List.Objects[Index1]).Var1;
R2:= TClass1(List.Objects[Index2]).Var1;
if R1 > R2 then
result := -1
else
if R1 < R2 then
result := 1
else
result := 0;
end;

StringList1.CustomSort(@SizeCustomSort);


Теперь вопрос - как сделать так, чтобы в функцию передавать имя класса и его член. Т.е. чтобы не нужно было писать для каждого стринглиста и класса свою функцию сортировки, а использовать универсальную.

Заранее большое спасибо!


Игорь Шевченко   (2002-06-07 13:42:00) [1]

Пример чего? класса с методом сравнения ?
type
TMyclass = class
public
function lessThan (const Item : TMyClass) : Boolean; virtual;
end;

Тогда функция для сортировки будет выглядеть как:
procedure mySortCompare(Key1, Key2 : Pointer) : Integer;
begin
if TMyClass(key1).lessThan(TMyClass(key2)) then
Result := -1
else if TMyClass(key2).lessThan(TMyClass(key1)) then
Result := 1
else
Result := 0;
end;

При наследовании надо переписать только функцию lessThan у наследников если сравнивать надо по-другому

end;


Smok_er   (2002-06-07 12:56:00) [2]

А можно пример?
Ну очень нужно, а описывать для каждого класса (а их у меня около 25) свою функцию сравнения не очень хочется.
Заранее спасибо!


Игорь Шевченко   (2002-06-06 15:54:00) [3]

Определить у элемента класса метод сравнения, наследовать все объекты в StringList от него, написать один раз функцию и все будет хорошо.


Smok_er   (2002-06-06 15:50:00) [4]

Мастера, неужели никто не знает???


Smok_er   (2002-06-06 10:35:00) [5]

Пробовал, выдавало ошибку. Посмотрел в хелп - stdcall указывать не надо, в отличие к примеру от customsort в листвью
Но неужели никак невозможно это сделать?
Мастера, отзовитесь!


Song   (2002-06-06 08:45:00) [6]

Никак, это заранее определённая ф-ия. Надо писать новую для каждого класса. Кстати stdcall Вы не забыли указать ?


Наверх

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