Сортування кількох TStringList
Є кілька TStringList, як зробити що б при сортуванні одного з них елементи інших перемістилися згідно зі списком який сортували, наприклад є два списки
список 1 список 2
після сортування список 1 виглядатиме так
Необхідно щоб елементи списку 2 перемістилися в результаті ось так
при(тобто. в ході виконання) сортування одного з них або після цього?
Різні ж речі.. та реалізації, відповідно, можуть бути різні ..
Що б у ході виконання
Чи дозволяється використання спадкоємців TStringList для вирішення задачі?
Тоді найпростіше рішення м.б., наприклад, ось таким:
TStringListEx = class(TStringList) protected procedure Exchange(Index1, Index2: Integer); override; end; .. procedure TStringListEx.Exchange(Index1, Index2: Integer); begin inherited; MirrorStringList.Exchange(Index1, Index2); end;
> При сортуванні першого списку ти у будь-якому випадку використовуєш > номери переставлених у списку елементівsorted:=true ніяких нієрів не надає
О, пардон. Неправильно це.
Прийде задіяти CustomSort.
> sorted:=true ніяких ноерів не надаєну так не використовувати його
TStringListEx = class(TStringList) protected FOriginalProc: TStringListSortCompare; public procedure CustomSort(Compare: TStringListSortCompare); override; end; ..
function CompareStrings(List: TStringList; Index1, Index2: Integer): Integer; begin Result := TStringListEx(List).FOriginalProc(List, Index1, Index2); if (Index1 0) then SomeAssotiatedStringList.Exchange(Index1, Index2); end;
procedure TStringListEx.CustomSort(Compare: TStringListSortCompare);override; begin FOriginalProc := @Compare; inherited CustomSort(@CompareStrings) ; end;
Я зараз роблю так
var i, k, l, m: integer; begin m:= 0; for i:= 0 to List1.Count - 1 do begin l:= 0; for k:= 0 to List1.Count - 1 do begin if AnsiCompareStr((List1.Strings[m]), (List1.Strings[List1.Count - 1 - k])) = 1 then begin List1.Move(m, List1.Count - 1 - k); List2.Move(m, List1.Count - 1 - k); List3.Move(m, List1.Count - 1 - k); end; end; if l = 0 then Inc(m) end;
але чомусь іноді якщо трапляються однакові записи в списку, то сортується неправильно
> якщо трапляються однакові записи у списку, то сортується > неправильноу першому неправильно чи у другому? у першому вони однакові - отже полядок довільний а у другому ти власного порядку не пропонував
А чим тебе не влаштувала вбудована в TStringList можливість сортування?
У тому раз у List1
наприклад, іноді виходить так
abcd abcd abcdf abcd abcdf abcdf abcdf abcdfg abcdfg
Хоча процедура працює правильно і вся справа в іншому, напевно щось у мене в кінцевому висновку результатів в ListView не так, втім буду розбиратися.
> Я зараз роблю так Взяти 2 стрингліста, і один TList, який буде зберігати індекси рядків, сортувати TList шляхом Sort з потрібною TListSortCompare. А для доступу до елементів другого списку використовувати відсортований TList.
Якщо інформація про одних і тих же "об'єктів" відображається в декількох контролах і при цьому порядок прямування їх повинен бути скрізь однаковий, то, ІМХО, варто ці об'єкти спочатку зберегти в список, а цей список "подавати" всім процедураммалювання. При зміні порядку чи складу об'єктів виконувати перемальовування всіх контролів. Тоді повна та "желена" синхронізація буде забезпечена