Migration von TDBGrid und cxGrid zu sgcGrid

sgcGrid ist ein VCL-Datengrid, TsgcVCLGrid, das sich an jedes TDataSet bindet und Gruppierung, Zusammenfassungen, Filterung, ein Suchfeld, Bänder und gespeicherte Layouts in jede Edition bringt. Dieses Kit ordnet jedes TDBGrid- und cxGrid-Mitglied, das Sie verwenden, seinem sgcGrid-Gegenstück zu, zeigt den Code einer kompilierten Demo und nennt ehrlich, was sich nicht zuordnen lässt.

Zwei Ausgangspunkte, ein Grid

Delphi-VCL-Teams mit dem Standard-TDBGrid und Teams mit dem DevExpress cxGrid, die das Abonnement überprüfen.

Von TDBGrid

Das Standard-VCL-TDBGrid zeigt und bearbeitet ein Dataset, und dort endet sein Funktionsumfang. Es hat keine Filterzeile, keinen Spaltenfilter, keine Gruppierung, keine Fuß- oder Gruppenzusammenfassungen, kein Suchfeld, keine Bänder, keine optimale Spaltenbreite und kein Speichern und Laden von Layouts. Jedes davon ist eigener Code oder ein Grid eines Drittanbieters. sgcGrid bietet Ihnen alles in einem Steuerelement, gebunden an das Dataset, das Sie bereits haben.

Von cxGrid

Das DevExpress cxGrid (ExpressQuantumGrid) ist ein breites und ausgereiftes Grid. Teams, die es überwiegend als Tabellenansicht mit Gruppierung, Zusammenfassungen, Filterung und gespeicherten Layouts nutzen, können diesen Umfang mit sgcGrid abdecken, mit vollständigem Quellcode, und ein Abonnement ablösen, das weit mehr als das Grid umfasst.

Was das Grid heute kostet: Am 20.10.2026 bot die DevExpress-VCL-Preisliste drei Abonnements an, alle mit dem ExpressQuantumGrid Control. Das günstigste ist das Express QuantumPack für USD 999,99, das VCL Subscription kostet USD 1.699,99. In einem Delphi-PRAXiS-Thread vom 18. September 2025 berichtete ein Nutzer, dass sein cxGrid-Abonnement von USD 400 auf USD 550 gestiegen sei, und ein anderes Mitglied zitierte eine DevExpress-Ankündigung, dass neue Express-GridPack-Lizenzen nicht mehr verkauft werden (aktive Abonnenten können weiter verlängern). sgcGrid wird pro Entwickler ab €199 lizenziert, mit vollständigem Quellcode und einem Jahr Updates, und ist außerdem Teil jeder sgcUI-Edition.

Ein Steuerelement, gebunden an jedes TDataSet

Ein TsgcVCLGrid und ein TsgcGridSource_DataSet mit DataSet, Grid und KeyField. Die Dataset-Ereignisse halten das Grid auf dem aktuellen Stand.

In jeder Edition

Entworfene Spalten, die über FieldName zugeordnet werden, Nachschlagefelder, Zellen-, Zeilen- und Mehrfachzeilenauswahl, Zeilenkopf, benutzerdefiniertes Zeichnen, Strg+C, Gruppierungsbereich, Fuß- und Gruppenzusammenfassungen, Filterzeile, Spaltenfilter im Excel-Stil, Suchfeld, Bänder, optimale Spaltenbreite sowie Speichern und Laden von Layouts als JSON.

Nur Registered Edition

Bearbeiten in beide Richtungen ins Dataset (WriteBack), Cursor-Synchronisierung (SyncCursor), Einfügen, Löschen, Einfügen aus der Zwischenablage und Rückgängig, die Kartenansicht (ViewStyle) und der Servermodus für sehr große Tabellen. Die Testversion enthält sie zur Evaluierung. Der Community-Build lässt sie weg: Die Demo lässt sich dort weiterhin kompilieren und zeigt ihre Grids schreibgeschützt.

TDBGrid-Mitglieder, sgcGrid-Entsprechungen

Jeder sgcGrid-Name unten steht im ausgelieferten Quellcode, und die von der Demo verwendeten lassen sich darin kompilieren.

TDBGrid sgcGrid Edition
TDBGridTsgcVCLGrid (Unit sgcGrid_VCL)Alle
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField, dann Active := True (Unit sgcGrid_Source_DataSet)Alle
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Entworfene Spalten bleiben erhalten und werden über FieldName zugeordnet; ohne Spalten erzeugt AutoColumns sieAlle
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleAlle
TColumn.ReadOnlyColumns[i].EditableAlle (Bearbeiten: Registered)
TColumn.PickList, Dropdown eines NachschlagefeldsColumns[i].PickList; bei einem Nachschlagefeld füllt die Quelle die Liste aus dem LookupDataSetAlle (Wert schreiben: Registered)
TField.DisplayFormatColumns[i].DisplayFormatAlle
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (Standard True) und TsgcGridSource_DataSet.WriteBackRegistered
dgRowSelectSelectionMode := gsmRow (gsmCell ohne diese Option)Alle
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Alle
dgIndicatorRowHeader := [grhIndicator] (auch grhNumbers, grhCheckBox)Alle
dgColLines, dgRowLinesGridLinesV, GridLinesHAlle
Der aktuelle Datensatz folgt dem GridTsgcGridSource_DataSet.SyncCursorRegistered
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell mit aDefaultDraw; nur für Farben OnGetCellStyle oder FormatRulesAlle
OnTitleClickOnHeaderClickAlle
Strg+C (eigener Code)Integriert (Strg+C, Strg+Einfg); der Text stammt aus SelectionToTextAlle
Tasten Einfg und Strg+EntfAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistered

cxGrid-Mitglieder, sgcGrid-Entsprechungen

Die cxGrid-Namen sind DevExpress-Bezeichner und dienen nur der Orientierung.

cxGrid sgcGrid Edition
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid und 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; Werte aus FooterSummary(aCol), FooterSummaryText(aCol); SummaryScopeAlle
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, mit dem SummaryType der Spalte in den GruppenAlle
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorAlle
Dropdown des SpaltenfiltersShowFilterButtons, 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), auch in und aus einem String oder Stream; automatisch mit AutoSaveLayout und LayoutStorageKeyAlle
OptionsCustomize.ColumnMovingColumnMovingAlle
Dialog zur SpaltenanpassungShowColumnChooserAlle
OnCustomDrawCellOnCustomDrawCellAlle
TcxGridDBCardView (eine zweite Ansicht)ViewStyle := gvsCard im selben Grid, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registered

Der Code aus der kompilierten Demo

Jeder Auszug stammt aus der Demo MigrateFromDBGrid, die sich mit Delphi 7 und Delphi 13 (Win32 und Win64) kompilieren lässt. Die Kommentare nennen den TDBGrid- oder cxGrid-Code, den sie ersetzen.

Bindung: DataSource wird zu einem TsgcGridSource_DataSet

Vorher: ein TDBGrid mit DataSource := dsProducts. Nachher: die Quellkomponente im Formular.

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

TDBGrid-Optionen werden zu Eigenschaften

Vorher: Options mit dgEditing, dgRowSelect, dgMultiSelect und dgIndicator. Nachher:

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 wird zu OnCustomDrawCell

Vorher: OnDrawColumnCell, das Column.FieldName und den Feldwert liest. Nachher: aCol ist der Columns-Index und aRow die Ansichtszeile von Data (CS_LOW_STOCK ist eine Konstante der 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, Cursor-Synchronisierung und Gruppierung

Vorher: dgEditing am TDBGrid und eine Spalte, die in die GroupByBox des cxGrid gezogen wird. Nachher:

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

Funktionen der cxGrid-Tabellenansicht zur Entwurfszeit

Vorher: Fußzeilen-Zusammenfassungselemente, die Group-by-Box, die Filterzeile, das Suchfeld und eine Tabellenansicht mit Bändern. Nachher: Spalteneigenschaften und Grid-Eigenschaften im Formular.

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>

Optimale Spaltenbreite, Layout und Kartenansicht

Vorher: ApplyBestFit, StoreToIniFile, RestoreFromIniFile und ein TcxGridDBCardView. Nachher:

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;

Sieben Schritte pro Formular

Die Datenschicht bleibt, wie sie ist. Nur das Grid und seine Optionen ändern sich.

1

Komponenten ablegen

Installieren Sie die sgcGrid-Pakete und legen Sie ein TsgcVCLGrid und ein TsgcGridSource_DataSet im Formular ab.

2

Auf das Dataset zeigen

Setzen Sie das DataSet der Quelle auf das Dataset, das das alte Grid verwendet hat (das Grid braucht die TDataSource nicht mehr), dann Grid und KeyField, ein eindeutiges Feld, das für Aktualisierungen an Ort und Stelle und für Write-back benötigt wird.

3

Spalten neu anlegen

Fügen Sie Columns mit FieldName, Caption, Width, DisplayFormat und Editable hinzu, oder lassen Sie Columns leer und AutoColumns sie aus den Feldern aufbauen.

4

Optionen zuordnen

ReadOnly und WriteBack für dgEditing, SelectionMode für dgRowSelect und dgMultiSelect, RowHeader für dgIndicator, SyncCursor für den aktuellen Datensatz.

5

Zeichencode verschieben

Verschieben Sie OnDrawColumnCell-Code nach OnCustomDrawCell, oder nach OnGetCellStyle, wenn er nur Farben setzt.

6

cxGrid-Funktionen einschalten

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; Zusammenfassungen nach Columns[i].SummaryType, Bänder nach Bands und Columns[i].Band, Layouts nach SaveLayoutToFile.

7

Aktivieren

Setzen Sie Active := True an der Quelle, sobald das Dataset geöffnet ist.

Was sich nicht eins zu eins zuordnen lässt

Lesen Sie dies, bevor Sie den Umstieg planen.

MigrateFromDBGrid

Ein TClientDataSet mit 40 Produkten und einem Nachschlagefeld Category, dargestellt auf zwei Seiten: "From TDBGrid" und "From cxGrid".

Wo sie liegt

Der sgcUI-Installer legt sie in Demos\Grid\Delphi\MigrateFromDBGrid ab: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm und eine readme.html.

So starten Sie sie

Öffnen Sie MigrateFromDBGrid.dpr in einem beliebigen Delphi von 7 bis 13, bauen Sie für Win32 oder Win64 und starten Sie. Jede Seite nennt das TDBGrid- oder cxGrid-Konzept neben seiner sgcGrid-Entsprechung.

Selbsttest

MigrateFromDBGrid.exe /test prüft die Zuordnung von Spalten und Optionen, den Kopiertext, die Gruppierung, die Fußzeilen-Zusammenfassung, Bänder, den Layout-Roundtrip und, in der Registered Edition, Write-back und die Kartenansicht, und beendet sich mit 0, wenn alle Prüfungen bestanden wurden.

Fairerweise gegenüber beiden Grids: cxGrid bietet Dinge, die sgcGrid nicht hat, etwa mehrere Ansichten und Ebenen in einem Grid-Steuerelement sowie INI-Layouts, und es kommt mit einer großen Suite weiterer Steuerelemente. Wenn Ihre Anwendung davon abhängt, ist der Umstieg größer, als diese Seite zeigt. sgcGrid ist der Weg, wenn Sie die oben genannten Grid-Funktionen nutzen und sie mit vollständigem Quellcode, in Delphi 7 bis 13, als einzelnes Produkt wünschen. Die vollständige Funktionsliste finden Sie auf der sgcGrid-Produktseite.

Bestes Preis-Leistungs-Verhältnis: All-AccessAlle eSeGeCe-Produkte, inklusive Premium-Support, ab €1,059 pro Jahr.
All-Access-Preise ansehen

Stellen Sie noch heute Ihr erstes Grid um

Laden Sie die sgcUI-Testversion mit sgcGrid und der Demo MigrateFromDBGrid herunter und portieren Sie Ihr erstes Formular.