Migreer van TDBGrid en cxGrid naar sgcGrid

sgcGrid is een VCL-datagrid, TsgcVCLGrid, dat aan elke TDataSet bindt en groeperen, samenvattingen, filteren, een zoekpaneel, banden en opgeslagen indelingen in elke editie brengt. Deze kit koppelt elk TDBGrid- en cxGrid-lid dat je gebruikt aan zijn sgcGrid-tegenhanger, toont de code uit een gecompileerde demo en noemt eerlijk wat niet past.

Twee vertrekpunten, één grid

Delphi VCL-teams met de standaard TDBGrid, en teams met het DevExpress cxGrid die hun abonnement tegen het licht houden.

Vanaf TDBGrid

De standaard VCL-TDBGrid toont en bewerkt een dataset, en daar stopt het. Er is geen filterrij, geen kolomfilter, geen groepering, geen voettekst- of groepssamenvattingen, geen zoekpaneel, geen banden, geen best fit en geen indeling opslaan en laden. Elk daarvan is eigen code of een grid van een derde partij. sgcGrid geeft je ze allemaal in één besturingselement, gebonden aan de dataset die je al hebt.

Vanaf cxGrid

Het DevExpress cxGrid (ExpressQuantumGrid) is een uitgebreid en volwassen grid. Teams die het vooral als tabelweergave gebruiken met groeperen, samenvattingen, filteren en opgeslagen indelingen, kunnen die set met sgcGrid afdekken, met volledige broncode, en een abonnement laten vallen dat veel meer dekt dan het grid.

Wat het grid vandaag kost: op 2026-10-20 bood de DevExpress VCL-prijslijst drie abonnementen aan, alle met het ExpressQuantumGrid Control. Het laagste is het Express QuantumPack voor USD 999.99, het VCL Subscription kost USD 1,699.99. In een Delphi-PRAXiS-draad van 18 september 2025 meldde een gebruiker dat zijn cxGrid-abonnement van USD 400 naar USD 550 ging, en een ander lid citeerde een DevExpress-aankondiging dat nieuwe Express GridPack-licenties niet meer worden verkocht (actieve abonnees kunnen nog verlengen). sgcGrid wordt per ontwikkelaar gelicentieerd vanaf €199 met volledige broncode en één jaar updates, en maakt ook deel uit van elke sgcUI-editie.

Eén besturingselement, gebonden aan elke TDataSet

Een TsgcVCLGrid en een TsgcGridSource_DataSet met DataSet, Grid en KeyField. De dataset-events houden het grid synchroon.

In elke editie

Ontworpen kolommen gekoppeld via FieldName, lookupvelden, cel-, rij- en multirijselectie, rijkop, custom draw, Ctrl+C, groepspaneel, voettekst- en groepssamenvattingen, filterrij, kolomfilter in Excel-stijl, zoekpaneel, banden, best fit, en JSON-indeling opslaan en laden.

Alleen geregistreerde editie

Tweerichtingsbewerking naar de dataset (WriteBack), cursorsynchronisatie (SyncCursor), invoegen, verwijderen, plakken en ongedaan maken, de kaartweergave (ViewStyle) en servermodus voor zeer grote tabellen. De proefversie bevat ze om te evalueren. De Community-build laat ze weg: de demo compileert daar nog steeds en toont zijn grids alleen-lezen.

TDBGrid-leden, sgcGrid-equivalenten

Elke sgcGrid-naam hieronder staat in de meegeleverde broncode, en de namen die de demo gebruikt compileren erin.

TDBGrid sgcGrid Editie
TDBGridTsgcVCLGrid (unit sgcGrid_VCL)Alle
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField, daarna Active := True (unit sgcGrid_Source_DataSet)Alle
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Ontworpen kolommen blijven behouden en worden via FieldName gekoppeld; zonder kolommen maakt AutoColumns ze aanAlle
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleAlle
TColumn.ReadOnlyColumns[i].EditableAlle (bewerken: geregistreerd)
TColumn.PickList, uitklaplijst van een lookupveldColumns[i].PickList; voor een lookupveld vult de bron de lijst vanuit de LookupDataSetAlle (waarde schrijven: geregistreerd)
TField.DisplayFormatColumns[i].DisplayFormatAlle
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (standaard True) en TsgcGridSource_DataSet.WriteBackGeregistreerd
dgRowSelectSelectionMode := gsmRow (zonder: gsmCell)Alle
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Alle
dgIndicatorRowHeader := [grhIndicator] (ook grhNumbers, grhCheckBox)Alle
dgColLines, dgRowLinesGridLinesV, GridLinesHAlle
Huidig record volgt het gridTsgcGridSource_DataSet.SyncCursorGeregistreerd
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell met aDefaultDraw; alleen voor kleuren OnGetCellStyle of FormatRulesAlle
OnTitleClickOnHeaderClickAlle
Ctrl+C (eigen code)Ingebouwd (Ctrl+C, Ctrl+Ins); de tekst komt van SelectionToTextAlle
Toetsen Insert en Ctrl+DelAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteGeregistreerd

cxGrid-leden, sgcGrid-equivalenten

De cxGrid-namen zijn DevExpress-identifiers en dienen alleen ter oriëntatie.

cxGrid sgcGrid Editie
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid en TsgcGridSource_DataSetAlle
TcxGridDBColumn.DataBinding.FieldNameColumns[i].FieldNameAlle
TcxGridDBColumn.GroupIndexColumns[i].GroupIndex; GroupBy(['Field']), ClearGrouping, GroupCountAlle
OptionsView.GroupByBoxShowGroupPanelAlle
DataController.Groups.FullExpand, FullCollapseExpandAll, CollapseAllAlle
OptionsView.FooterShowFooterAlle
DataController.Summary.FooterSummaryItems (skSum, skCount, skAverage, skMin, skMax)Columns[i].SummaryType (gsuSum, gsuCount, gsuAverage, gsuMin, gsuMax), SummaryFormat; waarden via FooterSummary(aCol), FooterSummaryText(aCol); SummaryScopeAlle
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, met de kolom-SummaryType in de groepenAlle
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorAlle
Uitklaplijst met kolomfilterShowFilterButtons, ShowFilterPopup(aCol), ClearColumnFilter(aCol), ClearColumnFilters, OnFilterChangeAlle
FindPanel.DisplayModeShowFindPanel, FindText, FindNext, FindPrevious, FindOnlyMatchesAlle
TcxGridDBBandedTableView.Bands, Column.Position.BandIndexBands (Caption, ParentBand, Visible), Columns[i].BandAlle
ApplyBestFitBestFitColumns, BestFitColumn(aCol), BestFitOnDblClick, BestFitSampleRowsAlle
StoreToIniFile, RestoreFromIniFileSaveLayoutToFile, LoadLayoutFromFile (JSON), ook naar en van een string of een stream; automatisch met AutoSaveLayout en LayoutStorageKeyAlle
OptionsCustomize.ColumnMovingColumnMovingAlle
Dialoogvenster voor kolomaanpassingShowColumnChooserAlle
OnCustomDrawCellOnCustomDrawCellAlle
TcxGridDBCardView (een tweede weergave)ViewStyle := gvsCard op hetzelfde grid, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Geregistreerd

De code, uit de gecompileerde demo

Elk fragment is gekopieerd uit de MigrateFromDBGrid-demo, die compileert met Delphi 7 en Delphi 13 (Win32 en Win64). De opmerkingen noemen de TDBGrid- of cxGrid-code die ze vervangt.

Binden: DataSource wordt een TsgcGridSource_DataSet

Voor: een TDBGrid met DataSource := dsProducts. Na: de broncomponent op het formulier.

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

TDBGrid-opties worden eigenschappen

Voor: Options met dgEditing, dgRowSelect, dgMultiSelect en dgIndicator. Na:

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 wordt OnCustomDrawCell

Voor: OnDrawColumnCell dat Column.FieldName en de veldwaarde leest. Na: aCol is de index in Columns en aRow de weergaverij van Data (CS_LOW_STOCK is een constante van de 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;

Terugschrijven, cursorsynchronisatie en groeperen

Voor: dgEditing op de TDBGrid, en een kolom die naar de GroupByBox van het cxGrid werd gesleept. Na:

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

Functies van de cxGrid-tabelweergave in ontwerptijd

Voor: voettekst-samenvattingsitems, de group-by-box, de filterrij, het zoekpaneel en een tabelweergave met banden. Na: kolomeigenschappen en grid-eigenschappen op het formulier.

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>

Best fit, indeling en kaartweergave

Voor: ApplyBestFit, StoreToIniFile, RestoreFromIniFile en een TcxGridDBCardView. Na:

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;

Zeven stappen per formulier

De datalaag blijft zoals ze is. Alleen het grid en zijn opties veranderen.

1

Zet de componenten neer

Installeer de sgcGrid-pakketten en zet dan een TsgcVCLGrid en een TsgcGridSource_DataSet op het formulier.

2

Wijs naar de dataset

Stel de bron-DataSet in op de dataset die het oude grid gebruikte (het grid heeft de TDataSource niet meer nodig), daarna Grid en KeyField, een uniek veld dat nodig is voor updates ter plekke en terugschrijven.

3

Maak de kolommen opnieuw

Voeg Columns toe met FieldName, Caption, Width, DisplayFormat en Editable, of laat Columns leeg en laat AutoColumns ze uit de velden opbouwen.

4

Koppel de opties

ReadOnly en WriteBack voor dgEditing, SelectionMode voor dgRowSelect en dgMultiSelect, RowHeader voor dgIndicator, SyncCursor voor het huidige record.

5

Verplaats de tekencode

Verplaats de code van OnDrawColumnCell naar OnCustomDrawCell, of naar OnGetCellStyle wanneer ze alleen kleuren instelt.

6

Schakel de cxGrid-functies in

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; samenvattingen naar Columns[i].SummaryType, banden naar Bands en Columns[i].Band, indelingen naar SaveLayoutToFile.

7

Activeer

Zet Active := True op de bron zodra de dataset geopend is.

Wat niet één op één past

Lees dit voordat je de overstap plant.

MigrateFromDBGrid

Eén TClientDataSet met 40 producten, met een lookupveld Category, getoond op twee pagina's: "Van TDBGrid" en "Van cxGrid".

Waar staat hij

Het sgcUI-installatieprogramma plaatst hem in Demos\Grid\Delphi\MigrateFromDBGrid: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm en een readme.html.

Zo draai je hem

Open MigrateFromDBGrid.dpr in een willekeurige Delphi van 7 tot en met 13, bouw Win32 of Win64 en start. Elke pagina noemt het TDBGrid- of cxGrid-concept naast het sgcGrid-equivalent.

Zelftest

MigrateFromDBGrid.exe /test controleert de mapping van kolommen en opties, de kopieertekst, groeperen, de voettekst-samenvatting, banden, de rondgang van de indeling en, in de geregistreerde editie, terugschrijven en de kaartweergave, en eindigt met 0 als elke controle is geslaagd.

Om beide grids recht te doen: cxGrid biedt dingen die sgcGrid niet heeft, zoals meerdere weergaven en niveaus in één gridbesturingselement en INI-indelingen, en het wordt geleverd met een grote suite andere besturingselementen. Als je applicatie daarvan afhangt, is de overstap groter dan deze pagina laat zien. sgcGrid is de weg als je de hierboven genoemde gridfuncties gebruikt, en je ze wilt met volledige broncode, in Delphi 7 tot en met 13, als één product. Zie de productpagina van sgcGrid voor de volledige functielijst.

De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Migreer je eerste grid vandaag

Download de sgcUI-proefversie met sgcGrid en de MigrateFromDBGrid-demo, en breng je eerste formulier over.