Ну это может выглядеть приблизительно так (возможно нужна некоторая доработка, написал от руки, не проверяя):
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; |
[001366]