Советы по Delphi


              

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;

[001366]



Содержание  Назад  Вперед