Форум: "Основная";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
ВнизCustomSort в Tstringlist Найти похожие ветки
← →
Smok_er (2002-06-06 00:03) [0]Уважаемые мастера!
Искал по всему архиву форума ответ, но ничего не нашел.
Есть небольшая проблема с сортировкой сабжа.
Создаем класс, к примеру
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);
Теперь вопрос - как сделать так, чтобы в функцию передавать имя класса и его член. Т.е. чтобы не нужно было писать для каждого стринглиста и класса свою функцию сортировки, а использовать универсальную.
Заранее большое спасибо!
← →
Song (2002-06-06 08:45) [1]Никак, это заранее определённая ф-ия. Надо писать новую для каждого класса. Кстати stdcall Вы не забыли указать ?
← →
Smok_er (2002-06-06 10:35) [2]Пробовал, выдавало ошибку. Посмотрел в хелп - stdcall указывать не надо, в отличие к примеру от customsort в листвью
Но неужели никак невозможно это сделать?
Мастера, отзовитесь!
← →
Smok_er (2002-06-06 15:50) [3]Мастера, неужели никто не знает???
← →
Игорь Шевченко (2002-06-06 15:54) [4]Определить у элемента класса метод сравнения, наследовать все объекты в StringList от него, написать один раз функцию и все будет хорошо.
← →
Smok_er (2002-06-07 12:56) [5]А можно пример?
Ну очень нужно, а описывать для каждого класса (а их у меня около 25) свою функцию сравнения не очень хочется.
Заранее спасибо!
← →
Игорь Шевченко (2002-06-07 13:42) [6]Пример чего? класса с методом сравнения ?
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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.20;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c