В статье рассматривается проблема, связанная со строковыми Grid в Delphi, когда после сортировки происходит разрушение структуры таблицы. Приводится пример кода, который SortSTLGrid использует для сортировки строкового Grid, но при этом происходит сдвиг отсортированных строк в конец таблицы, а иногда и вовсе без номеров строк или с сохранением номеров. В качестве решения предлагается изменить подход к заполнению строкового списка (StringList) перед сортировкой, чтобы избежать добавления пустых строк и, таким образом, сохранить структуру таблицы после сортировки.
Пример кода, который SortSTLGrid использует для сортировки строкового Grid:
procedure TfrmPuntehou.SortSTLGrid(var grid:TStringGrid; columntotal:integer);
const
separator = ',';
var
iCount, i, j, k, iPos: integer;
TheList: TStringList;
sString, sTempString: string;
begin
// процедура для сортировки от наименьшего к наибольшему значению
// получение количества строк
iCount := grid.RowCount;
// создание списка
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 + 2), Length(sString));
TheList.Strings[(k - 1)] := '';
TheList.Strings[(k - 1)] := sTempString;
end;
// заполнение таблицы отсортированными строками
for j := 1 to (iCount - 1) do
begin
grid.Rows[j].Text := TheList.Strings[(J - 1)];
end;
end;
finally
TheList.Free;
end;
// конец блока try..finally
end;
Решение проблемы заключается в том, чтобы не добавлять пустые строки в строковый список перед сортировкой. Это можно сделать, изменив процедуру заполнения списка, как показано в примере:
// процедура для сортировки от наименьшего к наибольшему значению
// получение количества строк
iCount := grid.RowCount;
// создание списка
TheList := TStringList.Create;
TheList.Sorted := False;
// блок try..finally
try
begin
// заполнение списка
for i := 1 to grid.RowCount do
begin
if not grid.Rows[i].Text.IsEmpty then
begin
TheList.Add(grid.Rows[i].Strings[columntotal] + separator + grid.Rows[i].Text);
end;
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 + 2), Length(sString));
TheList.Strings[(k - 1)] := '';
TheList.Strings[(k - 1)] := sTempString;
end;
// заполнение таблицы отсортированными строками
for j := 1 to grid.RowCount do
begin
grid.Rows[j].Text := TheList.Strings[(j - 1)];
end;
end;
finally
TheList.Free;
end;
// конец блока try..finally
Теперь, когда пустые строки не добавляются в строковый список перед сортировкой, сортировка строкового Grid происходит без разрушения структуры таблицы.
В статье рассматривается проблема разрушения структуры строкового Grid в Delphi после сортировки, и предлагается решение, заключающееся в изменении подхода к заполнению строкового списка перед сортировкой, чтобы избежать добавления пустых строк и сохранит
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.