Migrer de TDBGrid et cxGrid vers sgcGrid

sgcGrid est une grille de données VCL, TsgcVCLGrid, qui se lie à n'importe quel TDataSet et apporte regroupement, totaux, filtrage, panneau de recherche, bandes et mises en page enregistrées à chaque édition. Ce kit associe chaque membre de TDBGrid et de cxGrid que vous utilisez à son équivalent sgcGrid, montre le code d'une démo compilée et indique honnêtement ce qui ne correspond pas.

Deux points de départ, une seule grille

Les équipes Delphi VCL qui utilisent le TDBGrid standard, et celles qui utilisent la cxGrid de DevExpress et réexaminent leur abonnement.

Depuis TDBGrid

Le TDBGrid standard de la VCL affiche et modifie un jeu de données, et il s'arrête là. Il n'a ni ligne de filtre, ni filtre de colonne, ni regroupement, ni totaux de pied de page ou de groupe, ni panneau de recherche, ni bandes, ni ajustement automatique, ni enregistrement et chargement de la mise en page. Chacune de ces fonctions demande du code sur mesure ou une grille tierce. sgcGrid les réunit toutes dans un seul contrôle, lié au jeu de données que vous avez déjà.

Depuis cxGrid

La cxGrid de DevExpress (ExpressQuantumGrid) est une grille vaste et mature. Les équipes qui l'utilisent surtout comme une vue tableau avec regroupement, totaux, filtrage et mises en page enregistrées peuvent couvrir cet ensemble avec sgcGrid, avec le code source complet, et abandonner un abonnement qui couvre bien plus que la grille.

Ce que coûte la grille aujourd'hui : le 2026-10-20, la liste de prix VCL de DevExpress proposait trois abonnements, tous avec le contrôle ExpressQuantumGrid. Le moins cher est l'Express QuantumPack à 999,99 USD, l'abonnement VCL Subscription est à 1 699,99 USD. Dans un fil de Delphi-PRAXiS du 18 septembre 2025, un utilisateur signalait que son abonnement cxGrid passait de 400 USD à 550 USD, et un autre membre citait une annonce de DevExpress selon laquelle les nouvelles licences Express GridPack ne sont plus vendues (les abonnés actifs peuvent encore renouveler). sgcGrid est licencié par développeur à partir de €199 avec le code source complet et un an de mises à jour, et il fait aussi partie de chaque édition sgcUI.

Un contrôle, lié à n'importe quel TDataSet

Un TsgcVCLGrid et un TsgcGridSource_DataSet avec DataSet, Grid et KeyField. Les événements du jeu de données maintiennent la grille à jour.

Dans toutes les éditions

Colonnes conçues associées par FieldName, champs de référence (lookup), sélection de cellule, de ligne et de plusieurs lignes, en-tête de ligne, dessin personnalisé, Ctrl+C, panneau de regroupement, totaux de pied de page et de groupe, ligne de filtre, filtre de colonne de style Excel, panneau de recherche, bandes, ajustement automatique, et enregistrement et chargement de la mise en page en JSON.

Édition Registered uniquement

Édition bidirectionnelle dans le jeu de données (WriteBack), synchronisation du curseur (SyncCursor), insertion, suppression, collage et annulation, la vue en fiches (ViewStyle) et le mode serveur pour les très grandes tables. L'essai les inclut pour l'évaluation. La version Community les omet : la démo y compile quand même et affiche ses grilles en lecture seule.

Membres de TDBGrid, équivalents sgcGrid

Chaque nom sgcGrid ci-dessous figure dans le code source livré, et ceux que la démo utilise y compilent.

TDBGrid sgcGrid Édition
TDBGridTsgcVCLGrid (unité sgcGrid_VCL)Toutes
DataSourceTsgcGridSource_DataSet : DataSet, Grid, KeyField, puis Active := True (unité sgcGrid_Source_DataSet)Toutes
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Les colonnes conçues sont conservées et associées par FieldName ; sans colonnes, AutoColumns les créeToutes
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleToutes
TColumn.ReadOnlyColumns[i].EditableToutes (écriture : Registered)
TColumn.PickList, liste déroulante d'un champ de référenceColumns[i].PickList ; pour un champ de référence, la source remplit la liste à partir de LookupDataSetToutes (écriture de la valeur : Registered)
TField.DisplayFormatColumns[i].DisplayFormatToutes
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (True par défaut) et TsgcGridSource_DataSet.WriteBackRegistered
dgRowSelectSelectionMode := gsmRow (gsmCell sans cela)Toutes
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Toutes
dgIndicatorRowHeader := [grhIndicator] (aussi grhNumbers, grhCheckBox)Toutes
dgColLines, dgRowLinesGridLinesV, GridLinesHToutes
L'enregistrement courant suit la grilleTsgcGridSource_DataSet.SyncCursorRegistered
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell avec aDefaultDraw ; pour les couleurs seules, OnGetCellStyle ou FormatRulesToutes
OnTitleClickOnHeaderClickToutes
Ctrl+C (code sur mesure)Intégré (Ctrl+C, Ctrl+Ins) ; le texte vient de SelectionToTextToutes
Touches Inser et Ctrl+SupprAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistered

Membres de cxGrid, équivalents sgcGrid

Les noms cxGrid sont des identifiants DevExpress, donnés à titre indicatif seulement.

cxGrid sgcGrid Édition
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid et TsgcGridSource_DataSetToutes
TcxGridDBColumn.DataBinding.FieldNameColumns[i].FieldNameToutes
TcxGridDBColumn.GroupIndexColumns[i].GroupIndex; GroupBy(['Field']), ClearGrouping, GroupCountToutes
OptionsView.GroupByBoxShowGroupPanelToutes
DataController.Groups.FullExpand, FullCollapseExpandAll, CollapseAllToutes
OptionsView.FooterShowFooterToutes
DataController.Summary.FooterSummaryItems (skSum, skCount, skAverage, skMin, skMax)Columns[i].SummaryType (gsuSum, gsuCount, gsuAverage, gsuMin, gsuMax), SummaryFormat ; valeurs issues de FooterSummary(aCol), FooterSummaryText(aCol) ; SummaryScopeToutes
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, en utilisant le SummaryType de la colonne dans les groupesToutes
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorToutes
Liste déroulante de filtre de colonneShowFilterButtons, ShowFilterPopup(aCol), ClearColumnFilter(aCol), ClearColumnFilters, OnFilterChangeToutes
FindPanel.DisplayModeShowFindPanel, FindText, FindNext, FindPrevious, FindOnlyMatchesToutes
TcxGridDBBandedTableView.Bands, Column.Position.BandIndexBands (Caption, ParentBand, Visible), Columns[i].BandToutes
ApplyBestFitBestFitColumns, BestFitColumn(aCol), BestFitOnDblClick, BestFitSampleRowsToutes
StoreToIniFile, RestoreFromIniFileSaveLayoutToFile, LoadLayoutFromFile (JSON), aussi vers et depuis une chaîne ou un flux ; automatique avec AutoSaveLayout et LayoutStorageKeyToutes
OptionsCustomize.ColumnMovingColumnMovingToutes
Boîte de dialogue de personnalisation des colonnesShowColumnChooserToutes
OnCustomDrawCellOnCustomDrawCellToutes
TcxGridDBCardView (une seconde vue)ViewStyle := gvsCard sur la même grille, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registered

Le code, issu de la démo compilée

Chaque extrait est copié de la démo MigrateFromDBGrid, qui compile avec Delphi 7 et Delphi 13 (Win32 et Win64). Les commentaires nomment le code TDBGrid ou cxGrid qu'il remplace.

Liaison : DataSource devient un TsgcGridSource_DataSet

Avant : un TDBGrid avec DataSource := dsProducts. Après : le composant source sur la fiche.

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

Les options de TDBGrid deviennent des propriétés

Avant : Options avec dgEditing, dgRowSelect, dgMultiSelect et dgIndicator. Aprè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 devient OnCustomDrawCell

Avant : OnDrawColumnCell qui lit Column.FieldName et la valeur du champ. Après : aCol est l'index de Columns et aRow la ligne de vue de Data (CS_LOW_STOCK est une constante de la démo).

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;

Écriture dans le jeu de données, synchronisation du curseur et regroupement

Avant : dgEditing sur le TDBGrid, et une colonne glissée dans la GroupByBox de la cxGrid. Aprè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']);

Les fonctions de la vue tableau cxGrid à la conception

Avant : éléments de totaux de pied de page, zone de regroupement, ligne de filtre, panneau de recherche et vue tableau à bandes. Après : propriétés de colonne et propriétés de grille sur la fiche.

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>

Ajustement automatique, mise en page et vue en fiches

Avant : ApplyBestFit, StoreToIniFile, RestoreFromIniFile et un TcxGridDBCardView. Aprè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;

Sept étapes par fiche

La couche de données reste telle quelle. Seuls la grille et ses options changent.

1

Déposer les composants

Installez les paquets sgcGrid, puis déposez un TsgcVCLGrid et un TsgcGridSource_DataSet sur la fiche.

2

Pointer vers le jeu de données

Réglez le DataSet de la source sur le jeu de données qu'utilisait l'ancienne grille (la grille n'a plus besoin du TDataSource), puis Grid et KeyField, un champ unique nécessaire aux mises à jour sur place et à l'écriture.

3

Recréer les colonnes

Ajoutez des Columns avec FieldName, Caption, Width, DisplayFormat et Editable, ou laissez Columns vide et laissez AutoColumns les construire à partir des champs.

4

Associer les options

ReadOnly et WriteBack pour dgEditing, SelectionMode pour dgRowSelect et dgMultiSelect, RowHeader pour dgIndicator, SyncCursor pour l'enregistrement courant.

5

Déplacer le code de dessin

Déplacez le code de OnDrawColumnCell vers OnCustomDrawCell, ou vers OnGetCellStyle quand il ne fait que définir des couleurs.

6

Activer les fonctions de cxGrid

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel ; totaux vers Columns[i].SummaryType, bandes vers Bands et Columns[i].Band, mises en page vers SaveLayoutToFile.

7

Activer

Réglez Active := True sur la source une fois le jeu de données ouvert.

Ce qui ne correspond pas un pour un

Lisez ceci avant de planifier la migration.

MigrateFromDBGrid

Un TClientDataSet de 40 produits, avec un champ de référence Category, affiché sur deux pages : « From TDBGrid » et « From cxGrid ».

Où la trouver

Le programme d'installation sgcUI la place dans Demos\Grid\Delphi\MigrateFromDBGrid : MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm et un readme.html.

Comment l'exécuter

Ouvrez MigrateFromDBGrid.dpr dans n'importe quel Delphi de 7 à 13, compilez en Win32 ou Win64 et lancez. Chaque page nomme le concept TDBGrid ou cxGrid à côté de son équivalent sgcGrid.

Autotest

MigrateFromDBGrid.exe /test vérifie la correspondance des colonnes et des options, le texte copié, le regroupement, le total de pied de page, les bandes, l'aller-retour de la mise en page et, dans l'édition Registered, l'écriture dans le jeu de données et la vue en fiches, puis se termine avec le code 0 lorsque toutes les vérifications ont réussi.

Pour être juste envers les deux grilles : cxGrid offre des choses que sgcGrid n'offre pas, comme plusieurs vues et niveaux dans un même contrôle de grille et les mises en page INI, et elle est livrée avec une large suite d'autres contrôles. Si votre application en dépend, la migration est plus grosse que ne le montre cette page. sgcGrid est la voie à suivre lorsque les fonctions de grille listées ci-dessus sont celles que vous utilisez et que vous les voulez avec le code source complet, dans Delphi 7 à 13, en un seul produit. Pour la liste complète des fonctions, consultez la page produit sgcGrid.

Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Portez votre première grille dès aujourd'hui

Téléchargez l'essai sgcUI avec sgcGrid et la démo MigrateFromDBGrid, puis portez votre première fiche.