Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Обратная сортировка строк в TStringList после сортировки по возрастанию в Delphi"

Delphi , Базы данных , Сортировка и Фильтр

Delphi - обратная сортировка строк в TStringList после сортировки по возрастанию

При работе с TStringList в Delphi часто возникает необходимость отсортировать строки в списке. Однако, по умолчанию сортировка происходит по возрастанию. В этом материале мы рассмотрим, как выполнить обратную сортировку строк в TStringList после сортировки по возрастанию.

Проблема Разработчик столкнулся с трудностью при сортировке строк в TStringGrid. Он смог отсортировать строки по возрастанию, но не knows, как отсортировать их в обратном порядке. Он пытался использовать тот же код для другой сортировки, изменив последний цикл, чтобы прочитать TStringList с конца, но это не сработало и привело к тому, что одна строка из списка дублировалась во всех остальных строках. Есть ли способ обратиться к TStringList в обратном порядке после сортировки?

Код, который разработчик использовал для другой сортировки и пытался применить для этой сортировки (изменив только последний цикл):

procedure TfrmPuntehou.SortLTSGrid(var grid: TStringGrid; columntotal: Integer);
const
  separator = ',';
var
  iCount, i, j, k, iPos: Integer;
  TheList: TStringList;
  sString, sTempString: string;
  m, o: Integer;
begin
  //процедура для сортировки от больших к маленьким значениям

  //получить количество строк
  iCount := grid.RowCount - 1;

  //создать список
  TheList := TStringList.Create;
  TheList.Sorted := False;

  //начало блока try..finally
  try
    begin
      //заполнить список
      for i := 1 to (iCount - 1) do
      begin
        TheList.Add(grid.Rows[i].Strings[columntotal] + separator + grid.Rows[i].Text);
      end;

      //отсортировать список
      TheList.Sort;

      for k := 1 to TheList.Count do
      begin
        //получить строку из списка и поместить ее в переменную строки
        sString := TheList.Strings[(k - 1)];
        //найти позицию разделителя в этой строке
        iPos := AnsiPos(separator, sString);
        sTempString := '';
        //удалить разделитель и текст столбца в начале строки
        sTempString := Copy(sString, (iPos + 1), Length(sString));
        TheList.Strings[(k - 1)] := '';
        TheList.Strings[(k - 1)] := sTempString;
      end;

      //заполнить таблицу
      for j := (iCount - 1) downto 1 do
      begin
        for o := 1 to (iCount - 1) do
        begin
          grid.Rows[j].Text := TheList.Strings[(o - 1)];
        end;
      end;

      //заполнить номера строк
      for m := 1 to iCount do
      begin
        grid.Cells[0, m] := IntToStr(m);
      end;
    end;
  finally
    TheList.Free;
  end;
  //конец блока try..finally
end;

Решение Чтобы отсортировать TStringList в обратном порядке после сортировки по возрастанию, можно использовать процедуру CustomSort. Для этого нужно создать метод сравнения, который будет использоваться для сортировки. Метод сравнения определяет, как сравнивать две строки для определения их порядка в отсортированном списке.

Вот пример двух методов сравнения:

function Compare1(           // нормальная алфавитно-цифровая сортировка
  List: TStringList;
  Index1: Integer;
  Index2: Integer): Integer;
begin
  if List[Index1] = List[Index2] then
    Result := 0
  else if List[Index1] < List[Index2] then
    Result := -1
  else
    Result := 1;
end;

function Compare2(           // обратная алфавитно-цифровая сортировка
  List: TStringList;
  Index1: Integer;
  Index2: Integer): Integer;
begin
  if List[Index1] = List[Index2] then
    Result := 0
  else if List[Index1] < List[Index2] then
    Result := 1
  else
    Result := -1;
end;

Теперь, чтобы использовать эти методы сравнения для сортировки TStringList, можно воспользоваться следующим примером кода:

procedure TForm1.Button1Click(Sender: TObject);
var
  SList: TStringList;
  S: String;
begin
  SList := TStringList.Create;
  try
    SList.Add('Pierre');
    SList.Add('Albert');
    SList.Add('Paul');
    SList.Add('Jean');
    SList.Add('Simon');

    Memo1.Lines.Add('=== Compare1 ===');
    SList.CustomSort(Compare1);
    for S in SList do
      Memo1.Lines.Add(S);

    Memo1.Lines.Add('=== Compare2 ===');
    SList.CustomSort(Compare2);
    for S in SList do
      Memo1.Lines.Add(S);
  finally
    SList.Free;
  end;
end;

В этом примере создается список строк и добавляются пять имен. Затем выполняется сортировка списка с помощью двух методов сравнения: Compare1 (нормальная алфавитно-цифровая сортировка) и Compare2 (обратная алфавитно-цифровая сортировка). Результаты сортировки выводятся в Memo1.

Вывод В этом материале мы рассмотрели, как выполнить обратную сортировку строк в TStringList после сортировки по возрастанию в Delphi. Используя процедуру CustomSort и методы сравнения, можно легко отсортировать список строк в обратном порядке после сортировки по возрастанию.

Создано по материалам из источника по ссылке.

В материале рассматривается решение задачи обратной сортировки строк в TStringList после сортировки по возрастанию в Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сортировка и Фильтр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:45:11/0.0054459571838379/1