Migre do TDBGrid e do cxGrid para o sgcGrid

O sgcGrid é uma grade de dados VCL, o TsgcVCLGrid, que se liga a qualquer TDataSet e traz agrupamento, totais, filtros, painel de busca, bandas e layouts salvos para todas as edições. Este kit mapeia cada membro do TDBGrid e do cxGrid que você usa para o seu equivalente no sgcGrid, mostra o código de uma demo compilada e lista com honestidade o que não tem correspondência.

Dois pontos de partida, uma grade

Equipes Delphi VCL que usam o TDBGrid padrão, e equipes do DevExpress cxGrid que estão revendo a assinatura.

A partir do TDBGrid

O TDBGrid padrão da VCL mostra e edita um dataset, e é aí que ele para. Não tem linha de filtro, filtro por coluna, agrupamento, totais de rodapé ou de grupo, painel de busca, bandas, ajuste automático de largura nem salvar e carregar layout. Cada um desses recursos exige código próprio ou uma grade de terceiros. O sgcGrid reúne todos em um só controle, ligado ao dataset que você já tem.

A partir do cxGrid

O DevExpress cxGrid (ExpressQuantumGrid) é uma grade ampla e madura. As equipes que o usam principalmente como visão de tabela com agrupamento, totais, filtros e layouts salvos podem cobrir esse conjunto com o sgcGrid, com o código-fonte completo, e abrir mão de uma assinatura que cobre muito mais do que a grade.

O que a grade custa hoje: em 20/10/2026 a lista de preços do DevExpress VCL oferecia três assinaturas, todas com o ExpressQuantumGrid Control. A mais barata é o Express QuantumPack, a USD 999,99, e a VCL Subscription custa USD 1.699,99. Em uma discussão do Delphi-PRAXiS de 18 de setembro de 2025, um usuário relatou que sua assinatura do cxGrid subiu de USD 400 para USD 550, e outro membro citou um comunicado do DevExpress segundo o qual novas licenças do Express GridPack deixaram de ser vendidas (assinantes ativos ainda podem renovar). O sgcGrid é licenciado por desenvolvedor a partir de €199 com o código-fonte completo e um ano de atualizações, e também faz parte de todas as edições do sgcUI.

Um controle, ligado a qualquer TDataSet

Um TsgcVCLGrid e um TsgcGridSource_DataSet com DataSet, Grid e KeyField. Os eventos do dataset mantêm a grade sincronizada.

Em todas as edições

Colunas projetadas associadas por FieldName, campos de lookup, seleção de célula, de linha e de várias linhas, cabeçalho de linha, desenho personalizado, Ctrl+C, painel de grupos, totais de rodapé e de grupo, linha de filtro, filtro de coluna no estilo do Excel, painel de busca, bandas, ajuste automático de largura e salvar e carregar o layout em JSON.

Somente na edição Registrada

Edição nos dois sentidos para o dataset (WriteBack), sincronização do cursor (SyncCursor), inserir, excluir, colar e desfazer, a visão de cartões (ViewStyle) e o modo servidor para tabelas muito grandes. A versão de avaliação os inclui para teste. A versão Community os deixa de fora: a demo continua compilando nela e mostra suas grades somente para leitura.

Membros do TDBGrid, equivalentes no sgcGrid

Todo nome do sgcGrid abaixo está no código-fonte distribuído, e os que a demo usa compilam nela.

TDBGrid sgcGrid Edição
TDBGridTsgcVCLGrid (unit sgcGrid_VCL)Todas
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField e depois Active := True (unit sgcGrid_Source_DataSet)Todas
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. As colunas projetadas são mantidas e associadas por FieldName; sem colunas, AutoColumns as criaTodas
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleTodas
TColumn.ReadOnlyColumns[i].EditableTodas (edição: Registrada)
TColumn.PickList, lista suspensa de campo lookupColumns[i].PickList; para um campo lookup, a fonte preenche a lista a partir do LookupDataSetTodas (gravar o valor: Registrada)
TField.DisplayFormatColumns[i].DisplayFormatTodas
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (padrão True) e TsgcGridSource_DataSet.WriteBackRegistrada
dgRowSelectSelectionMode := gsmRow (gsmCell sem ele)Todas
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Todas
dgIndicatorRowHeader := [grhIndicator] (também grhNumbers, grhCheckBox)Todas
dgColLines, dgRowLinesGridLinesV, GridLinesHTodas
O registro atual acompanha a gradeTsgcGridSource_DataSet.SyncCursorRegistrada
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell com aDefaultDraw; só para cores, OnGetCellStyle ou FormatRulesTodas
OnTitleClickOnHeaderClickTodas
Ctrl+C (código próprio)Nativo (Ctrl+C, Ctrl+Ins); o texto vem de SelectionToTextTodas
Teclas Insert e Ctrl+DelAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistrada

Membros do cxGrid, equivalentes no sgcGrid

Os nomes do cxGrid são identificadores do DevExpress, dados apenas como referência.

cxGrid sgcGrid Edição
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid e TsgcGridSource_DataSetTodas
TcxGridDBColumn.DataBinding.FieldNameColumns[i].FieldNameTodas
TcxGridDBColumn.GroupIndexColumns[i].GroupIndex; GroupBy(['Field']), ClearGrouping, GroupCountTodas
OptionsView.GroupByBoxShowGroupPanelTodas
DataController.Groups.FullExpand, FullCollapseExpandAll, CollapseAllTodas
OptionsView.FooterShowFooterTodas
DataController.Summary.FooterSummaryItems (skSum, skCount, skAverage, skMin, skMax)Columns[i].SummaryType (gsuSum, gsuCount, gsuAverage, gsuMin, gsuMax), SummaryFormat; valores de FooterSummary(aCol), FooterSummaryText(aCol); SummaryScopeTodas
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, usando o SummaryType da coluna nos gruposTodas
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorTodas
Lista suspensa de filtro da colunaShowFilterButtons, ShowFilterPopup(aCol), ClearColumnFilter(aCol), ClearColumnFilters, OnFilterChangeTodas
FindPanel.DisplayModeShowFindPanel, FindText, FindNext, FindPrevious, FindOnlyMatchesTodas
TcxGridDBBandedTableView.Bands, Column.Position.BandIndexBands (Caption, ParentBand, Visible), Columns[i].BandTodas
ApplyBestFitBestFitColumns, BestFitColumn(aCol), BestFitOnDblClick, BestFitSampleRowsTodas
StoreToIniFile, RestoreFromIniFileSaveLayoutToFile, LoadLayoutFromFile (JSON), também de e para uma string ou um stream; automático com AutoSaveLayout e LayoutStorageKeyTodas
OptionsCustomize.ColumnMovingColumnMovingTodas
Diálogo de personalização de colunasShowColumnChooserTodas
OnCustomDrawCellOnCustomDrawCellTodas
TcxGridDBCardView (uma segunda visão)ViewStyle := gvsCard na mesma grade, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registrada

O código, da demo compilada

Cada trecho é copiado da demo MigrateFromDBGrid, que compila no Delphi 7 e no Delphi 13 (Win32 e Win64). Os comentários indicam o código do TDBGrid ou do cxGrid que ele substitui.

Ligação: o DataSource vira um TsgcGridSource_DataSet

Antes: um TDBGrid com DataSource := dsProducts. Depois: o componente de fonte no formulário.

frmMain.dfm
object SourceDB: TsgcGridSource_DataSet
  DataSet = cdsProducts
  Grid = GridDB
  KeyField = 'ID'
  Left = 280
  Top = 520
end

As opções do TDBGrid viram propriedades

Antes: Options com dgEditing, dgRowSelect, dgMultiSelect e dgIndicator. Depois:

frmMain.pas
procedure TFormMain.chkOptionsClick(Sender: TObject);
begin
  // TDBGrid.ReadOnly / Options dgEditing -> ReadOnly
{$IFDEF SGC_GRID_EDIT}
  GridDB.ReadOnly := not chkEditing.Checked;
{$ENDIF}
  // dgMultiSelect -> gsmMultiRow, dgRowSelect -> gsmRow, neither -> gsmCell
  if chkMultiSelect.Checked then
    GridDB.SelectionMode := gsmMultiRow
  else if chkRowSelect.Checked then
    GridDB.SelectionMode := gsmRow
  else
    GridDB.SelectionMode := gsmCell;
  // dgIndicator -> RowHeader [grhIndicator] (grhNumbers, grhCheckBox too)
  if chkIndicator.Checked then
    GridDB.RowHeader := [grhIndicator]
  else
    GridDB.RowHeader := [];
end;

OnDrawColumnCell vira OnCustomDrawCell

Antes: OnDrawColumnCell lendo Column.FieldName e o valor do campo. Depois: aCol é o índice em Columns e aRow a linha da visão de Data (CS_LOW_STOCK é uma constante da demo).

frmMain.pas
procedure TFormMain.GridDBCustomDrawCell(Sender: TObject; aCanvas: TsgcUICanvas;
  aRow, aCol, aLeft, aTop, aRight, aBottom: Integer;
  aState: TsgcGridCellDrawStates; var aDefaultDraw: Boolean);
begin
  // TDBGrid.OnDrawColumnCell: Column.FieldName and Field.AsInteger.
  // sgcGrid: aCol is the Columns index, aRow the view row of Data. The
  // background is painted already; aDefaultDraw False would skip the text
  if (aRow < 0) or (aRow >= GridDB.Data.ViewCount) or
    (GridDB.Columns[aCol].FieldName <> 'Qty') then
    Exit;
  if StrToIntDef(VarToStr(GridDB.Data.Cells[aRow, aCol]), 0) < CS_LOW_STOCK
  then
  begin
    // a red marker at the left edge of a low stock cell
    aCanvas.BeginPath;
    aCanvas.Rectangle(aLeft, aTop + 4, aLeft + 4, aBottom - 4);
    aCanvas.ClosePath;
    aCanvas.FillPath($FFDC2626);
  end;
end;

Write back, sincronização do cursor e agrupamento

Antes: dgEditing no TDBGrid, e uma coluna arrastada para o GroupByBox do cxGrid. Depois:

frmMain.pas
procedure TFormMain.FormCreate(Sender: TObject);
begin
  DoCreateData;
  // TDBGrid: DataSource := dsProducts. sgcGrid: a TsgcGridSource_DataSet
  // with DataSet, Grid and KeyField (set on the form). The grid columns are
  // designed on the form like TDBGrid.Columns, matched by FieldName
{$IFDEF SGC_GRID_EDIT}
  // TDBGrid dgEditing posts edits to the dataset: WriteBack. The current
  // record follows the focused row and back: SyncCursor
  SourceDB.WriteBack := True;
  SourceDB.SyncCursor := True;
{$ELSE}
  chkEditing.Checked := False;
  chkEditing.Enabled := False;
  chkEditing.Caption := 'Editing (Registered edition)';
  GridDB.ReadOnly := True;
{$ENDIF}
  SourceDB.Active := True;
  SourceCx.Active := True;
  chkOptionsClick(nil);
  // cxGrid: drag a column to the GroupByBox. sgcGrid: ShowGroupPanel, and
  // GroupBy from code (cxGridDBColumn.GroupIndex is Columns[i].GroupIndex)
  GridCx.GroupBy(['Category']);

Recursos da visão de tabela do cxGrid em tempo de projeto

Antes: itens de total de rodapé, a caixa de agrupamento, a linha de filtro, o painel de busca e uma visão de tabela com bandas. Depois: propriedades de coluna e propriedades da grade no formulário.

frmMain.dfm
Columns = <
  item
    FieldName = 'ID'
    Caption = 'ID'
    DataType = gdtInteger
    Width = 60
    SummaryType = gsuCount
    Band = 0
  end
  item
    FieldName = 'Product'
    Caption = 'Product'
    Width = 220
    Band = 0
  end
  item
    FieldName = 'Category'
    Caption = 'Category'
    Width = 140
    Band = 0
  end
  item
    FieldName = 'Price'
    Caption = 'Price'
    DataType = gdtFloat
    Width = 110
    DisplayFormat = '#,##0.00'
    SummaryType = gsuAverage
    SummaryFormat = '#,##0.00'
    Band = 1
  end
  item
    FieldName = 'Qty'
    Caption = 'Qty'
    DataType = gdtInteger
    Width = 90
    SummaryType = gsuSum
    Band = 1
  end>
FormatRules = <>
ShowFooter = True
ShowGroupPanel = True
GroupSummaries = True
ShowFilterButtons = True
ShowFilterRow = True
ShowFindPanel = True
Bands = <
  item
    Caption = 'Product'
  end
  item
    Caption = 'Stock and price'
  end>

Ajuste de largura, layout e visão de cartões

Antes: ApplyBestFit, StoreToIniFile, RestoreFromIniFile e um TcxGridDBCardView. Depois:

frmMain.pas
procedure TFormMain.btnBestFitClick(Sender: TObject);
begin
  // cxGridDBTableView.ApplyBestFit -> BestFitColumns (BestFitColumn(i) for
  // one column, BestFitOnDblClick for the header divider)
  GridCx.BestFitColumns;
end;

function TFormMain.DoLayoutFile: string;
begin
  Result := ExtractFilePath(ParamStr(0)) + 'migratefromdbgrid_layout.json';
end;

procedure TFormMain.btnSaveLayoutClick(Sender: TObject);
begin
  // cxGridDBTableView.StoreToIniFile -> SaveLayoutToFile (JSON: columns,
  // widths, order, sort, grouping, filters, summaries, bands, view)
  GridCx.SaveLayoutToFile(DoLayoutFile);
  DoShowStatus('layout saved to ' + ExtractFileName(DoLayoutFile));
end;

procedure TFormMain.btnLoadLayoutClick(Sender: TObject);
begin
  // cxGridDBTableView.RestoreFromIniFile -> LoadLayoutFromFile
  if GridCx.LoadLayoutFromFile(DoLayoutFile) then
    DoShowStatus('layout loaded')
  else
    DoShowStatus('no saved layout');
end;

procedure TFormMain.chkCardViewClick(Sender: TObject);
begin
{$IFDEF SGC_GRID_ADVANCED}
  // cxGridDBCardView (a second view of the level) -> ViewStyle gvsCard of
  // the same grid, CardOptions for the caption field and the card size
  if chkCardView.Checked then
    GridCx.ViewStyle := gvsCard
  else
    GridCx.ViewStyle := gvsTable;
{$ENDIF}
end;

Sete passos por formulário

A camada de dados continua como está. Só a grade e as suas opções mudam.

1

Solte os componentes

Instale os pacotes do sgcGrid e solte um TsgcVCLGrid e um TsgcGridSource_DataSet no formulário.

2

Aponte para o dataset

Defina o DataSet da fonte como o dataset que a grade antiga usava (a grade já não precisa do TDataSource) e depois Grid e KeyField, um campo único necessário para as atualizações no local e para o write back.

3

Recrie as colunas

Adicione Columns com FieldName, Caption, Width, DisplayFormat e Editable, ou deixe Columns vazio e deixe que AutoColumns as crie a partir dos campos.

4

Mapeie as opções

ReadOnly e WriteBack para dgEditing, SelectionMode para dgRowSelect e dgMultiSelect, RowHeader para dgIndicator, SyncCursor para o registro atual.

5

Mova o código de desenho

Mova o código de OnDrawColumnCell para OnCustomDrawCell, ou para OnGetCellStyle quando ele só define cores.

6

Ative os recursos do cxGrid

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; totais para Columns[i].SummaryType, bandas para Bands e Columns[i].Band, layouts para SaveLayoutToFile.

7

Ative

Defina Active := True na fonte quando o dataset estiver aberto.

O que não tem correspondência um a um

Leia isto antes de planejar a mudança.

MigrateFromDBGrid

Um TClientDataSet com 40 produtos, com um campo lookup Category, mostrado em duas páginas: "From TDBGrid" e "From cxGrid".

Onde está

O instalador do sgcUI a coloca em Demos\Grid\Delphi\MigrateFromDBGrid: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm e um readme.html.

Como executá-la

Abra MigrateFromDBGrid.dpr em qualquer Delphi do 7 ao 13, compile para Win32 ou Win64 e execute. Cada página indica o conceito do TDBGrid ou do cxGrid ao lado do seu equivalente no sgcGrid.

Autoteste

MigrateFromDBGrid.exe /test verifica o mapeamento de colunas e opções, o texto copiado, o agrupamento, o total de rodapé, as bandas, a ida e volta do layout e, na edição Registrada, o write back e a visão de cartões, e termina com 0 quando todas as verificações passam.

Para ser justo com as duas grades: o cxGrid oferece coisas que o sgcGrid não tem, como várias visões e níveis em um só controle de grade e layouts INI, e vem com uma grande suíte de outros controles. Se a sua aplicação depende disso, a mudança é maior do que esta página mostra. O sgcGrid é o caminho quando os recursos de grade listados acima são os que você usa e você os quer com o código-fonte completo, no Delphi 7 a 13, como um único produto. Para a lista completa de recursos veja a página do produto sgcGrid.

Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Migre a sua primeira grade hoje

Baixe a versão de avaliação do sgcUI com o sgcGrid e a demo MigrateFromDBGrid, e porte o seu primeiro formulário.