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

StringGrid как DBGrid

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

StringGrid как DBGrid

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


table.first;
row := 0;
grid.rowcount := table.recordCount;
while not table.eof do 
begin
  for 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;
  if not 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 do
  try

    grid.ColCount := fFields.Count;
    DisableControls;
    // Фильтр был установлен с помощью свойства Self.Filter
    First;
    while not EOF do
    try
      grid.RowCount := Row + 1;
      for i := 0 to grid.ColCount - 1 do
      begin
        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;
    end
  finally
    doGrid.RowCount := grid.RowCount;
    doGrid.ColCount := grid.ColCount;
    for i := 0 to grid.ColCount - 1 do
    begin
      doGrid.Cols[i] := grid.Cols[i];
      doGrid.ColWidths[i] := fColWidths[i] + 4
    end
      grid.Free;
    EnableControls
  end
end;

Here's the translation of the text into Russian:

Инициализация Вы создаете временный объект TStringGrid (grid) для избежания проблемы с многими событиями, которые вызываются при загрузке данных из базы данных. Это хорошая подходка.

Загрузка данных Ваш цикл для загрузки данных из базы данных корректен, но вы можете рассмотреть более эффективный способ загрузки данных в bulk, например, используя TBufferStream или TMemoryStream.

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

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

Альтернативное решение Вот альтернативное решение, которое включает некоторые из этих предложений:

procedure TformLookupDB.FillCells;
var
  Row: INTEGER;
begin
  doGrid.RowCount := 0;

  if not Assigned(fDB) then
    Exit;

  fColWidths := Repeat(100, fFields.Count);

  grid := TStringGrid.Create(Self);
  grid.Visible := FALSE;

  try
    with fDB do
    begin
      DisableControls;
      First;
      while not EOF do
      begin
        grid.RowCount := Row + 1;
        for i := 0 to fFields.Count - 1 do
        begin
          grid.Cells[i, Row] :=
            FieldByName(fFields.Strings[i]).AsString;
        end;
        INC(Row);
      end;
    end;
  finally
    doGrid.RowCount := grid.RowCount;
    doGrid.ColCount := grid.ColCount;
    for i := 0 to fColWidths.Length - 1 do
    begin
      doGrid.Cols[i] := grid.Cols[i];
      doGrid.ColWidths[i] := fColWidths[i] + 4;
    end;
    grid.Free;
    EnableControls;
  end;
end;

В этом варианте я:

  • Упрощил инициализацию fColWidths с помощью повторения.
  • Удалил ненужные переменные и присвоил их напрямую объекту TStringGrid.
  • Использовал более компактный цикл для загрузки данных из базы данных.
  • Оставил тот же логик для обновления ширины строк и столбцов.

Обратите внимание, что это только альтернативное решение, и вам может потребоваться адаптация его к вашим конкретным требованиям.

StringGrid как DBGrid: описывает способ загрузки данных из отфильтрованной таблицы в StringGrid с помощью цикла и присваивания значений ячейкам.


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

Получайте свежие новости и обновления по 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-01-29 01:35:04/0.0037178993225098/0