StringGrid как DBGrid
Материал из DRKB
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;
Source: http://delphiworld.narod.ru/
ID: 01092