Migra de TDBGrid y cxGrid a sgcGrid

sgcGrid es un grid de datos VCL, TsgcVCLGrid, que se enlaza a cualquier TDataSet y aporta agrupación, resúmenes, filtrado, un panel de búsqueda, bandas y diseños guardados a todas las ediciones. Este kit relaciona cada miembro de TDBGrid y cxGrid que usas con su equivalente en sgcGrid, muestra el código de una demo compilada y enumera con honestidad lo que no se corresponde.

Dos puntos de partida, un solo grid

Equipos Delphi VCL con el TDBGrid estándar, y equipos con el cxGrid de DevExpress que revisan la suscripción.

Desde TDBGrid

El TDBGrid estándar de la VCL muestra y edita un dataset, y ahí se queda. No tiene fila de filtro, ni filtro por columna, ni agrupación, ni resúmenes de pie o de grupo, ni panel de búsqueda, ni bandas, ni ajuste automático de ancho, ni guardado y carga de diseño. Cada una de esas funciones es código propio o un grid de terceros. sgcGrid te da todas en un solo control, enlazado al dataset que ya tienes.

Desde cxGrid

El cxGrid de DevExpress (ExpressQuantumGrid) es un grid amplio y maduro. Los equipos que lo usan sobre todo como vista de tabla con agrupación, resúmenes, filtrado y diseños guardados pueden cubrir ese conjunto con sgcGrid, con el código fuente completo, y prescindir de una suscripción que cubre mucho más que el grid.

Lo que cuesta hoy el grid: el 2026-10-20 la lista de precios VCL de DevExpress ofrecía tres suscripciones, todas con el ExpressQuantumGrid Control. La más económica es Express QuantumPack, a 999,99 USD, y la VCL Subscription cuesta 1.699,99 USD. En un hilo de Delphi-PRAXiS del 18 de septiembre de 2025 un usuario contó que su suscripción de cxGrid pasó de 400 USD a 550 USD, y otro miembro citó un anuncio de DevExpress según el cual ya no se venden licencias nuevas de Express GridPack (los suscriptores activos aún pueden renovar). sgcGrid se licencia por desarrollador desde €199 con el código fuente completo y un año de actualizaciones, y además forma parte de todas las ediciones de sgcUI.

Un control, enlazado a cualquier TDataSet

Un TsgcVCLGrid y un TsgcGridSource_DataSet con DataSet, Grid y KeyField. Los eventos del dataset mantienen el grid sincronizado.

En todas las ediciones

Columnas de diseño emparejadas por FieldName, campos de búsqueda (lookup), selección de celda, de fila y de varias filas, cabecera de fila, dibujo personalizado, Ctrl+C, panel de grupos, resúmenes de pie y de grupo, fila de filtro, filtro de columna al estilo Excel, panel de búsqueda, bandas, ajuste automático de ancho y guardado y carga del diseño en JSON.

Solo en la edición Registered

Edición bidireccional sobre el dataset (WriteBack), sincronización del cursor (SyncCursor), insertar, eliminar, pegar y deshacer, la vista de tarjetas (ViewStyle) y el modo servidor para tablas muy grandes. La versión de prueba los incluye para evaluación. La compilación Community los deja fuera: la demo sigue compilando allí y muestra sus grids en solo lectura.

Miembros de TDBGrid y sus equivalentes en sgcGrid

Cada nombre de sgcGrid de abajo está en el código fuente distribuido, y los que usa la demo compilan en ella.

TDBGrid sgcGrid Edición
TDBGridTsgcVCLGrid (unidad sgcGrid_VCL)Todas
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField, y después Active := True (unidad sgcGrid_Source_DataSet)Todas
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Las columnas de diseño se conservan y se emparejan por FieldName; sin columnas, AutoColumns las creaTodas
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleTodas
TColumn.ReadOnlyColumns[i].EditableTodas (edición: Registered)
TColumn.PickList, lista desplegable de un campo lookupColumns[i].PickList; en un campo lookup el origen rellena la lista desde LookupDataSetTodas (escribir el valor: Registered)
TField.DisplayFormatColumns[i].DisplayFormatTodas
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (por defecto True) y TsgcGridSource_DataSet.WriteBackRegistered
dgRowSelectSelectionMode := gsmRow (gsmCell sin ella)Todas
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Todas
dgIndicatorRowHeader := [grhIndicator] (también grhNumbers, grhCheckBox)Todas
dgColLines, dgRowLinesGridLinesV, GridLinesHTodas
El registro actual sigue al gridTsgcGridSource_DataSet.SyncCursorRegistered
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell con aDefaultDraw; solo para colores, OnGetCellStyle o FormatRulesTodas
OnTitleClickOnHeaderClickTodas
Ctrl+C (código propio)Integrado (Ctrl+C, Ctrl+Ins); el texto sale de SelectionToTextTodas
Teclas Insert y Ctrl+SuprAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistered

Miembros de cxGrid y sus equivalentes en sgcGrid

Los nombres de cxGrid son identificadores de DevExpress, indicados solo como orientación.

cxGrid sgcGrid Edición
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid y 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 desde FooterSummary(aCol), FooterSummaryText(aCol); SummaryScopeTodas
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, que usa el SummaryType de la columna en los gruposTodas
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorTodas
Lista desplegable de filtro de columnaShowFilterButtons, 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), también hacia y desde una cadena o un stream; automático con AutoSaveLayout y LayoutStorageKeyTodas
OptionsCustomize.ColumnMovingColumnMovingTodas
Diálogo de personalización de columnasShowColumnChooserTodas
OnCustomDrawCellOnCustomDrawCellTodas
TcxGridDBCardView (una segunda vista)ViewStyle := gvsCard en el mismo grid, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registered

El código, de la demo compilada

Cada fragmento está copiado de la demo MigrateFromDBGrid, que compila con Delphi 7 y Delphi 13 (Win32 y Win64). Los comentarios nombran el código de TDBGrid o cxGrid que sustituye.

Enlace: DataSource pasa a ser un TsgcGridSource_DataSet

Antes: un TDBGrid con DataSource := dsProducts. Después: el componente de origen en el formulario.

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

Las opciones de TDBGrid pasan a ser propiedades

Antes: Options con dgEditing, dgRowSelect, dgMultiSelect y dgIndicator. Después:

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 pasa a ser OnCustomDrawCell

Antes: OnDrawColumnCell leyendo Column.FieldName y el valor del campo. Después: aCol es el índice de Columns y aRow la fila de vista de Data (CS_LOW_STOCK es una constante de la 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;

Escritura en el dataset, sincronización del cursor y agrupación

Antes: dgEditing en el TDBGrid, y una columna arrastrada al GroupByBox del cxGrid. Después:

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']);

Funciones de la vista de tabla de cxGrid en tiempo de diseño

Antes: elementos de resumen de pie, el cuadro de agrupación, la fila de filtro, el panel de búsqueda y una vista de tabla con bandas. Después: propiedades de columna y propiedades del grid en el formulario.

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 ancho, diseño y vista de tarjetas

Antes: ApplyBestFit, StoreToIniFile, RestoreFromIniFile y un TcxGridDBCardView. Después:

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;

Siete pasos por formulario

La capa de datos se queda como está. Solo cambian el grid y sus opciones.

1

Suelta los componentes

Instala los paquetes de sgcGrid y suelta un TsgcVCLGrid y un TsgcGridSource_DataSet en el formulario.

2

Apunta al dataset

Asigna a DataSet del origen el dataset que usaba el grid anterior (el grid ya no necesita el TDataSource), y después Grid y KeyField, un campo único necesario para las actualizaciones en el sitio y para la escritura en el dataset.

3

Recrea las columnas

Añade Columns con FieldName, Caption, Width, DisplayFormat y Editable, o deja Columns vacío y deja que AutoColumns las construya a partir de los campos.

4

Relaciona las opciones

ReadOnly y WriteBack para dgEditing, SelectionMode para dgRowSelect y dgMultiSelect, RowHeader para dgIndicator, SyncCursor para el registro actual.

5

Mueve el código de dibujo

Mueve el código de OnDrawColumnCell a OnCustomDrawCell, o a OnGetCellStyle cuando solo establece colores.

6

Activa las funciones de cxGrid

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; los resúmenes a Columns[i].SummaryType, las bandas a Bands y Columns[i].Band, los diseños a SaveLayoutToFile.

7

Activa

Asigna Active := True al origen una vez que el dataset esté abierto.

Lo que no se corresponde uno a uno

Léelo antes de planificar el cambio.

MigrateFromDBGrid

Un TClientDataSet con 40 productos, con un campo lookup Category, mostrado en dos páginas: "From TDBGrid" y "From cxGrid".

Dónde está

El instalador de sgcUI la deja en Demos\Grid\Delphi\MigrateFromDBGrid: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm y un readme.html.

Cómo ejecutarla

Abre MigrateFromDBGrid.dpr en cualquier Delphi de la 7 a la 13, compila para Win32 o Win64 y ejecuta. Cada página nombra el concepto de TDBGrid o cxGrid junto a su equivalente en sgcGrid.

Autotest

MigrateFromDBGrid.exe /test comprueba la correspondencia de columnas y opciones, el texto copiado, la agrupación, el resumen de pie, las bandas, el ciclo de guardar y cargar el diseño y, en la edición Registered, la escritura en el dataset y la vista de tarjetas, y termina con 0 cuando todas las comprobaciones han pasado.

Para ser justos con ambos grids: cxGrid ofrece cosas que sgcGrid no tiene, como varias vistas y niveles en un solo control de grid y diseños INI, y viene con una gran suite de otros controles. Si tu aplicación depende de ellas, el cambio es mayor de lo que muestra esta página. sgcGrid es el camino cuando las funciones de grid enumeradas arriba son las que usas, y las quieres con el código fuente completo, en Delphi 7 a 13, como un único producto. Para la lista completa de funciones consulta la página del producto sgcGrid.

La mejor opción: All-AccessTodos los productos de eSeGeCe, con Premium Support incluido, desde €1,059 al año.
Ver precios de All-Access

Migra tu primer grid hoy

Descarga la prueba de sgcUI con sgcGrid y la demo MigrateFromDBGrid, y migra tu primer formulario.