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

Сортировка TStringGrid с исключением пустых ячеек и сохранением Grid.Objects

Delphi , Компоненты и Классы , TStringGrid и TDrawGrid

 

Введение

При работе с компонентом TStringGrid в Delphi часто возникает необходимость сортировки данных в одной или нескольких колонках. Однако стандартные методы сортировки не всегда учитывают все нюансы, такие как обработка пустых ячеек или сохранение связанных с ячейками объектов (grid.Objects). В этой статье мы рассмотрим несколько способов решения этой задачи.

Проблема

Основная сложность при сортировке TStringGrid заключается в том, что:

  1. Пустые ячейки должны игнорироваться при сортировке
  2. Связанные с ячейками объекты (grid.Objects) должны сохраняться и перемещаться вместе с соответствующими ячейками
  3. Сортировка может выполняться как по возрастанию, так и по убыванию

Решение 1: Прямая сортировка с сохранением объектов

function TForm1.SortGridByColumn(Grid: TStringGrid; Column: Integer;
  Ascending: Boolean): Boolean;
var
  i, j: Integer;
  TempStr: string;
  TempObj: TObject;
  StartRow: Integer;
begin
  Result := True;
  try
    StartRow := Grid.FixedRows; // Пропускаем заголовки
    for i := StartRow to Grid.RowCount - 2 do
      for j := i + 1 to Grid.RowCount - 1 do
      begin
        if (Grid.Cells[Column, j] <> '') then
        begin
          if (Grid.Cells[Column, i] = '') or
             (Ascending and (CompareText(Grid.Cells[Column, i], Grid.Cells[Column, j]) > 0)) or
             (not Ascending and (CompareText(Grid.Cells[Column, i], Grid.Cells[Column, j]) < 0)) then
          begin
            // Обмен содержимого ячеек, включая связанные объекты
            TempStr := Grid.Cells[Column, i];
            TempObj := Grid.Objects[Column, i];

            Grid.Cells[Column, i] := Grid.Cells[Column, j];
            Grid.Objects[Column, i] := Grid.Objects[Column, j];

            Grid.Cells[Column, j] := TempStr;
            Grid.Objects[Column, j] := TempObj;
          end;
        end;
      end;
  except
    Result := False;
  end;
end;

Решение 2: Использование записи для хранения данных

type
  TCopyRec = record
    crObj: TObject;
    crStr: string;
  end;

function TForm1.SortGridByColumn2(Grid: TStringGrid; Column: Integer;
  Ascending: Boolean): Boolean;
var
  i, j: Integer;
  Temp: TCopyRec;
begin
  Result := True;
  try
    for i := Grid.FixedRows to Grid.RowCount - 2 do
      for j := i + 1 to Grid.RowCount - 1 do
      begin
        if (Grid.Cells[Column, j] <> '') and 
           ((Grid.Cells[Column, i] = '') or 
            (Ascending and (CompareText(Grid.Cells[Column, i], Grid.Cells[Column, j]) > 0)) or
            (not Ascending and (CompareText(Grid.Cells[Column, i], Grid.Cells[Column, j]) < 0))) then
        begin
          Temp.crStr := Grid.Cells[Column, i];
          Temp.crObj := Grid.Objects[Column, i];

          Grid.Cells[Column, i] := Grid.Cells[Column, j];
          Grid.Objects[Column, i] := Grid.Objects[Column, j];

          Grid.Cells[Column, j] := Temp.crStr;
          Grid.Objects[Column, j] := Temp.crObj;
        end;
      end;
  except
    Result := False;
  end;
end;

Решение 3: Использование TStringList для сортировки

procedure TForm1.SortGridUsingStringList(Grid: TStringGrid; Column: Integer; Ascending: Boolean);
var
  i: Integer;
  TempList: TStringList;
  TempObj: TObject;
begin
  TempList := TStringList.Create;
  try
    // Заполняем список данными из колонки
    for i := Grid.FixedRows to Grid.RowCount - 1 do
    begin
      if Grid.Cells[Column, i] <> '' then
      begin
        TempList.AddObject(Grid.Cells[Column, i], Grid.Objects[Column, i]);
      end;
    end;

    // Сортируем список
    TempList.Sort;
    if not Ascending then
    begin
      for i := 0 to TempList.Count div 2 - 1 do
        TempList.Exchange(i, TempList.Count - 1 - i);
    end;

    // Заполняем отсортированными данными
    for i := 0 to TempList.Count - 1 do
    begin
      Grid.Cells[Column, i + Grid.FixedRows] := TempList[i];
      Grid.Objects[Column, i + Grid.FixedRows] := TempList.Objects[i];
    end;

    // Очищаем оставшиеся ячейки
    for i := TempList.Count + Grid.FixedRows to Grid.RowCount - 1 do
    begin
      Grid.Cells[Column, i] := '';
      Grid.Objects[Column, i] := nil;
    end;
  finally
    TempList.Free;
  end;
end;

Сравнение методов

  1. Прямая сортировка:
    Плюсы: Не требует дополнительных объектов, работает напрямую с гридом
    Минусы: Медленнее при большом количестве данных
  2. Использование записи:
    Плюсы: Более структурированный код
    Минусы: Незначительное увеличение сложности

  3. Использование TStringList:
    Плюсы: Использует встроенные механизмы сортировки, быстрее на больших объемах
    Минусы: Требует дополнительного объекта, сложнее в реализации

Рекомендации

  1. Для небольших таблиц (до 1000 строк) можно использовать любой из предложенных методов.
  2. Для больших объемов данных лучше использовать TStringList.
  3. Если важна максимальная производительность, можно рассмотреть использование специализированных компонентов для работы с таблицами.

Заключение

Сортировка TStringGrid с сохранением связанных объектов и игнорированием пустых ячеек - задача, которая может быть решена несколькими способами. Выбор конкретного метода зависит от требований к производительности и личных предпочтений разработчика. Все предложенные в статье решения проверены на практике и могут быть использованы в реальных проектах.

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

Статья описывает методы сортировки данных в TStringGrid с сохранением связанных объектов и исключением пустых ячеек.


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

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




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


:: Главная :: TStringGrid и TDrawGrid ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-04 06:48:19/0.0057179927825928/0