Ну это может выглядеть приблизительно так (возможно нужна некоторая
доработка, написал от руки, не проверяя):
table.first;
row := 0;
grid.rowcount := table.recordCount;
whilenot table.eof dobeginfor i := 0 to table.fieldCount-1 do
grid.cells[i,row] := table.fields[i].asString;
inc (row);
table.next;
end;
У меня тоже имееются свои причины использования TStringGrid. Вот мой код,
который загружает данные из отфильтрованной таблицы. Он не очень изящен, т.к.
реально является лишь черновиком. У меня это работает, а большего мне и не
нужно. Работает очень быстро, даже в случае сотни загруженных колонок. Есть
много ссылок на внешние переменные. Надеюсь что они не слишком заумные.
procedure TformLookupDB.FillCells;
var
Row, i: INTEGER;
w: INTEGER;
grid: TStringGrid;
begin
doGrid.RowCount := 0;
ifnot ASSIGNED(fDB) then
EXIT;
Row := 0;
for i := LOW(fColWidths) to HIGH(fColWidths) do
fColWidths[i] := 100
// Данный временный объект-сетка используется для предохранения от огромного// количества подразумеваемых событий Application.ProcessMessages,// инициируемых базой данных, и вызывающих противное моргание объекта// doGrid. Итак, мы загружаем данные в объект-сетку// и затем копируем их в стобцы, начиная с верхней части.
grid := TStringGrid.Create(Self);
grid.Visible := FALSE;
with fDB dotry
grid.ColCount := fFields.Count;
DisableControls;
// Фильтр был установлен с помощью свойства Self.Filter
First;
whilenot EOF dotry
grid.RowCount := Row + 1;
for i := 0 to grid.ColCount - 1 dobegin
grid.Cells[i, Row] :=
FieldByName(fFields.Strings[i]).AsString
w := doGrid.Canvas.TEXTWIDTH(grid.Cells[i,
Row]);
if fColWidths[i] < w then
fColWidths[i] := w;
end
INC(Row);
finally
Next;
endfinally
doGrid.RowCount := grid.RowCount;
doGrid.ColCount := grid.ColCount;
for i := 0 to grid.ColCount - 1 dobegin
doGrid.Cols[i] := grid.Cols[i];
doGrid.ColWidths[i] := fColWidths[i] + 4
end
grid.Free;
EnableControls
endend;
Here's the translation of the text into Russian:
Инициализация
Вы создаете временный объект TStringGrid (grid) для избежания проблемы с многими событиями, которые вызываются при загрузке данных из базы данных. Это хорошая подходка.
Загрузка данных
Ваш цикл для загрузки данных из базы данных корректен, но вы можете рассмотреть более эффективный способ загрузки данных в bulk, например, используя TBufferStream или TMemoryStream.
Ширина строк и столбцов
Вы рассчитываете ширину каждого столбца, перебирая ячейки и проверяете их ширину. Это может быть неэффективно, если у вас есть много столбцов. Вместо этого вы можете рассмотреть установку ширины столбца в фиксированное значение или использовать более сложный алгоритм для определения оптимальной ширины столбца.
Организация кода
Ваш код очень длинный и плотный. Он будет полезнее разбить на меньшие функции, каждая из которых имеет свою ответственность. Это сделает ваш код более легким для чтения и обслуживания.
Альтернативное решение
Вот альтернативное решение, которое включает некоторые из этих предложений:
Упрощил инициализацию fColWidths с помощью повторения.
Удалил ненужные переменные и присвоил их напрямую объекту TStringGrid.
Использовал более компактный цикл для загрузки данных из базы данных.
Оставил тот же логик для обновления ширины строк и столбцов.
Обратите внимание, что это только альтернативное решение, и вам может потребоваться адаптация его к вашим конкретным требованиям.
StringGrid как DBGrid: описывает способ загрузки данных из отфильтрованной таблицы в StringGrid с помощью цикла и присваивания значений ячейкам.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.