Вы работаете с TStringList и хотите отсортировать его строки в соответствии с определенными правилами, основываясь на значениях в конкретных колонках. В этой статье мы рассмотрим, как отсортировать TStringList по нескольким колонкам в Delphi.
Проблема
У вас есть TStringList, содержащий много строк, и вам нужно отсортировать его по определенным значениям в зависимости от колонки, в которой они находятся. Например:
Вы хотите отсортировать строки сначала по значению в 25-30-й колонке (BABABA), а затем, если есть совпадение, по значению в 39-45-й колонке (номер). Если номера не совпадают, сортировка должна происходить по значению в 25-30-й колонке, а если и это не поможет, то любым другим способом.
Решение
Для решения этой проблемы вы можете использовать метод CustomSort компонента TStringList. Этот метод позволяет сортировать список по пользовательскому сравнению, которое вы определяете. В нашем случае мы создадим функцию сравнения, которая будет сравнивать строки по заданным колонкам.
Сначала определим функцию, извлекающую подстроку, используемую для сравнения:
function GetOrderingSubString(const s: string): string;
begin
Assert(Length(s)=45);
Result := Copy(s, 25, 6) + Copy(s, 39, 7);
end;
Теперь создадим функцию сравнения, которая будет использовать нашу функцию извлечения подстроки:
function CompareItems(List: TStringList; Index1, Index2: Integer): Integer;
begin
Result := CompareText(GetOrderingSubString(List[Index1]), GetOrderingSubString(List[Index2]));
end;
Наконец, воспользуемся методом CustomSort, передав ему нашу функцию сравнения:
List.CustomSort(CompareItems);
После выполнения этого кода TStringList будет отсортирован в соответствии с заданными правилами.
Альтернативный ответ
Если вам нужно отсортировать TStringList по нескольким колонкам, но с другими правилами, вы можете изменить функцию сравнения, чтобы она соответствовала вашим требованиям. Например, если вы хотите сначала отсортировать по 39-45-й колонке, а затем по 25-30-й колонке, просто поменяйте местами вызовы Copy в функции GetOrderingSubString.
Подтвержденный ответ
В вашем случае сначала нужно отсортировать по 25-30-й колонке, а затем, если есть совпадение, по 39-45-й колонке. Используйте метод CustomSort и функцию сравнения, как описано выше, чтобы отсортировать TStringList по заданным правилам.
Нужно отсортировать TStringList по нескольким колонкам в Delphi, используя метод CustomSort и функцию сравнения, чтобы сначала отсортировать по 25-30-й колонке, а затем, если есть совпадение, по 39-45-й колонке.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.