Migrare da TDBGrid e cxGrid a sgcGrid

sgcGrid è una griglia dati VCL, TsgcVCLGrid, che si collega a qualsiasi TDataSet e offre raggruppamento, riepiloghi, filtri, un pannello di ricerca, bande e layout salvati in ogni edizione. Questo kit associa ogni membro di TDBGrid e cxGrid che usi al suo equivalente in sgcGrid, mostra il codice di una demo compilata ed elenca con onestà ciò che non si associa.

Due punti di partenza, una sola griglia

I team Delphi VCL che usano il TDBGrid standard e i team che usano il DevExpress cxGrid e stanno rivalutando l'abbonamento.

Da TDBGrid

Il TDBGrid standard di VCL mostra e modifica un dataset, e qui si ferma. Non ha riga filtro, filtro di colonna, raggruppamento, riepiloghi a piè di pagina o di gruppo, pannello di ricerca, bande, adattamento ottimale né salvataggio e caricamento del layout. Ognuna di queste funzioni è codice personalizzato o una griglia di terze parti. sgcGrid le offre tutte in un unico controllo, collegato al dataset che hai già.

Da cxGrid

Il DevExpress cxGrid (ExpressQuantumGrid) è una griglia ampia e matura. I team che lo usano soprattutto come vista tabella con raggruppamento, riepiloghi, filtri e layout salvati possono coprire questo insieme con sgcGrid, con il codice sorgente completo, e rinunciare a un abbonamento che copre molto più della sola griglia.

Quanto costa oggi la griglia: il 2026-10-20 il listino VCL di DevExpress offriva tre abbonamenti, tutti con il controllo ExpressQuantumGrid. Il più economico è Express QuantumPack a 999,99 USD, mentre la VCL Subscription costa 1.699,99 USD. In una discussione di Delphi-PRAXiS del 18 settembre 2025 un utente ha segnalato che il suo abbonamento a cxGrid è passato da 400 a 550 USD, e un altro membro ha citato un annuncio di DevExpress secondo cui le nuove licenze Express GridPack non vengono più vendute (gli abbonati attivi possono ancora rinnovare). sgcGrid è concesso in licenza per sviluppatore a partire da €199, con il codice sorgente completo e un anno di aggiornamenti, ed è incluso anche in ogni edizione di sgcUI.

Un controllo, collegato a qualsiasi TDataSet

Un TsgcVCLGrid e un TsgcGridSource_DataSet con DataSet, Grid e KeyField. Gli eventi del dataset mantengono la griglia allineata.

In ogni edizione

Colonne definite in fase di progettazione associate tramite FieldName, campi lookup, selezione di cella, riga e più righe, intestazione di riga, disegno personalizzato, Ctrl+C, pannello di raggruppamento, riepiloghi a piè di pagina e di gruppo, riga filtro, filtro di colonna in stile Excel, pannello di ricerca, bande, adattamento ottimale e salvataggio e caricamento del layout in JSON.

Solo edizione Registered

Modifica bidirezionale nel dataset (WriteBack), sincronizzazione del cursore (SyncCursor), inserimento, eliminazione, incolla e annulla, la vista a schede (ViewStyle) e la modalità server per tabelle molto grandi. La versione di prova le include per la valutazione. La build Community le esclude: la demo viene comunque compilata e mostra le griglie in sola lettura.

Membri di TDBGrid, equivalenti in sgcGrid

Ogni nome di sgcGrid riportato di seguito è presente nel codice sorgente distribuito, e quelli usati dalla demo vengono compilati.

TDBGrid sgcGrid Edizione
TDBGridTsgcVCLGrid (unit sgcGrid_VCL)Tutte
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField, poi Active := True (unit sgcGrid_Source_DataSet)Tutte
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Le colonne definite in fase di progettazione vengono mantenute e associate tramite FieldName; senza colonne, AutoColumns le creaTutte
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleTutte
TColumn.ReadOnlyColumns[i].EditableTutte (modifica: Registered)
TColumn.PickList, elenco a discesa del campo lookupColumns[i].PickList; per un campo lookup la sorgente riempie l'elenco da LookupDataSetTutte (scrittura del valore: Registered)
TField.DisplayFormatColumns[i].DisplayFormatTutte
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (predefinito True) e TsgcGridSource_DataSet.WriteBackRegistered
dgRowSelectSelectionMode := gsmRow (senza di esso gsmCell)Tutte
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Tutte
dgIndicatorRowHeader := [grhIndicator] (anche grhNumbers, grhCheckBox)Tutte
dgColLines, dgRowLinesGridLinesV, GridLinesHTutte
Il record corrente segue la grigliaTsgcGridSource_DataSet.SyncCursorRegistered
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell con aDefaultDraw; solo per i colori, OnGetCellStyle o FormatRulesTutte
OnTitleClickOnHeaderClickTutte
Ctrl+C (codice personalizzato)Integrato (Ctrl+C, Ctrl+Ins); il testo proviene da SelectionToTextTutte
Tasti Insert e Ctrl+DelAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistered

Membri di cxGrid, equivalenti in sgcGrid

I nomi di cxGrid sono identificatori di DevExpress, riportati solo per orientamento.

cxGrid sgcGrid Edizione
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid e TsgcGridSource_DataSetTutte
TcxGridDBColumn.DataBinding.FieldNameColumns[i].FieldNameTutte
TcxGridDBColumn.GroupIndexColumns[i].GroupIndex; GroupBy(['Field']), ClearGrouping, GroupCountTutte
OptionsView.GroupByBoxShowGroupPanelTutte
DataController.Groups.FullExpand, FullCollapseExpandAll, CollapseAllTutte
OptionsView.FooterShowFooterTutte
DataController.Summary.FooterSummaryItems (skSum, skCount, skAverage, skMin, skMax)Columns[i].SummaryType (gsuSum, gsuCount, gsuAverage, gsuMin, gsuMax), SummaryFormat; valori da FooterSummary(aCol), FooterSummaryText(aCol); SummaryScopeTutte
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, che usa il SummaryType della colonna nei gruppiTutte
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorTutte
Elenco a discesa del filtro di colonnaShowFilterButtons, ShowFilterPopup(aCol), ClearColumnFilter(aCol), ClearColumnFilters, OnFilterChangeTutte
FindPanel.DisplayModeShowFindPanel, FindText, FindNext, FindPrevious, FindOnlyMatchesTutte
TcxGridDBBandedTableView.Bands, Column.Position.BandIndexBands (Caption, ParentBand, Visible), Columns[i].BandTutte
ApplyBestFitBestFitColumns, BestFitColumn(aCol), BestFitOnDblClick, BestFitSampleRowsTutte
StoreToIniFile, RestoreFromIniFileSaveLayoutToFile, LoadLayoutFromFile (JSON), anche verso e da una stringa o uno stream; automatico con AutoSaveLayout e LayoutStorageKeyTutte
OptionsCustomize.ColumnMovingColumnMovingTutte
Finestra di personalizzazione delle colonneShowColumnChooserTutte
OnCustomDrawCellOnCustomDrawCellTutte
TcxGridDBCardView (una seconda vista)ViewStyle := gvsCard sulla stessa griglia, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registered

Il codice, dalla demo compilata

Ogni estratto è copiato dalla demo MigrateFromDBGrid, che viene compilata con Delphi 7 e Delphi 13 (Win32 e Win64). I commenti indicano il codice di TDBGrid o cxGrid che sostituisce.

Collegamento: DataSource diventa un TsgcGridSource_DataSet

Prima: un TDBGrid con DataSource := dsProducts. Dopo: il componente sorgente sul form.

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

Le opzioni di TDBGrid diventano proprietà

Prima: Options con dgEditing, dgRowSelect, dgMultiSelect e dgIndicator. Dopo:

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

Prima: OnDrawColumnCell che legge Column.FieldName e il valore del campo. Dopo: aCol è l'indice di Columns e aRow la riga della vista di Data (CS_LOW_STOCK è una costante della 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, sincronizzazione del cursore e raggruppamento

Prima: dgEditing sul TDBGrid e una colonna trascinata nel GroupByBox di cxGrid. Dopo:

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

Funzioni della vista tabella di cxGrid in fase di progettazione

Prima: elementi di riepilogo a piè di pagina, il group by box, la riga filtro, il pannello di ricerca e una vista tabella a bande. Dopo: proprietà delle colonne e proprietà della griglia sul form.

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>

Adattamento ottimale, layout e vista a schede

Prima: ApplyBestFit, StoreToIniFile, RestoreFromIniFile e un TcxGridDBCardView. Dopo:

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;

Sette passaggi per ogni form

Il livello dati resta com'è. Cambiano solo la griglia e le sue opzioni.

1

Inserisci i componenti

Installa i pacchetti sgcGrid, poi inserisci un TsgcVCLGrid e un TsgcGridSource_DataSet sul form.

2

Punta al dataset

Imposta il DataSet della sorgente sul dataset usato dalla vecchia griglia (la griglia non ha più bisogno del TDataSource), poi Grid e KeyField, un campo univoco necessario per gli aggiornamenti sul posto e per il write back.

3

Ricrea le colonne

Aggiungi Columns con FieldName, Caption, Width, DisplayFormat e Editable, oppure lascia vuoto Columns e lascia che AutoColumns le costruisca dai campi.

4

Associa le opzioni

ReadOnly e WriteBack per dgEditing, SelectionMode per dgRowSelect e dgMultiSelect, RowHeader per dgIndicator, SyncCursor per il record corrente.

5

Sposta il codice di disegno

Sposta il codice di OnDrawColumnCell in OnCustomDrawCell, oppure in OnGetCellStyle quando imposta solo i colori.

6

Attiva le funzioni di cxGrid

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; i riepiloghi in Columns[i].SummaryType, le bande in Bands e Columns[i].Band, i layout in SaveLayoutToFile.

7

Attiva

Imposta Active := True sulla sorgente una volta aperto il dataset.

Cosa non si associa uno a uno

Leggi questa sezione prima di pianificare il passaggio.

MigrateFromDBGrid

Un solo TClientDataSet di 40 prodotti, con un campo lookup Category, mostrato su due pagine: "Da TDBGrid" e "Da cxGrid".

Dove si trova

L'installer di sgcUI la copia in Demos\Grid\Delphi\MigrateFromDBGrid: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm e un readme.html.

Come eseguirla

Apri MigrateFromDBGrid.dpr in qualsiasi Delphi dal 7 al 13, compila per Win32 o Win64 ed esegui. Ogni pagina indica il concetto di TDBGrid o cxGrid accanto al suo equivalente in sgcGrid.

Test automatico

MigrateFromDBGrid.exe /test verifica la mappatura di colonne e opzioni, il testo copiato, il raggruppamento, il riepilogo a piè di pagina, le bande, il ciclo di salvataggio e caricamento del layout e, nell'edizione Registered, il write back e la vista a schede, poi termina con 0 quando tutti i controlli sono superati.

Per essere onesti con entrambe le griglie: cxGrid offre cose che sgcGrid non ha, come più viste e livelli in un unico controllo griglia e i layout INI, e include una vasta suite di altri controlli. Se la tua applicazione dipende da queste funzioni, il passaggio è più impegnativo di quanto mostri questa pagina. sgcGrid è la strada giusta quando le funzioni della griglia elencate sopra sono quelle che usi e le vuoi con il codice sorgente completo, in Delphi dal 7 al 13, come un unico prodotto. Per l'elenco completo delle funzioni vedi la pagina del prodotto sgcGrid.

La scelta più conveniente: All-AccessTutti i prodotti eSeGeCe, con Supporto Premium incluso, a partire da €1,059/anno.
Vedi i prezzi All-Access

Porta oggi la tua prima griglia

Scarica la versione di prova di sgcUI con sgcGrid e la demo MigrateFromDBGrid, e porta il tuo primo form.