Migracja z TDBGrid i cxGrid do sgcGrid

sgcGrid to siatka danych VCL, TsgcVCLGrid, która łączy się z dowolnym TDataSet i w każdej edycji zapewnia grupowanie, sumy, filtrowanie, panel wyszukiwania, pasma oraz zapisywane układy. Ten zestaw przyporządkowuje każdy używany przez Ciebie element TDBGrid i cxGrid jego odpowiednikowi w sgcGrid, pokazuje kod ze skompilowanej wersji demonstracyjnej i uczciwie wskazuje, co do siebie nie pasuje.

Dwa punkty wyjścia, jedna siatka

Zespoły Delphi VCL, które używają standardowego TDBGrid, oraz te, które używają cxGrid firmy DevExpress i przeglądają swoją subskrypcję.

Z TDBGrid

Standardowy TDBGrid z VCL wyświetla i edytuje zestaw danych, ale na tym kończy się jego rola. Nie ma wiersza filtra, filtra kolumn, grupowania, sum w stopce i grupach, panelu wyszukiwania, pasm, automatycznego dopasowania ani zapisu i wczytywania układu. Każda z tych funkcji wymaga własnego kodu albo siatki firm trzecich. sgcGrid łączy je wszystkie w jednej kontrolce, podłączonej do zestawu danych, który już masz.

Z cxGrid

cxGrid firmy DevExpress (ExpressQuantumGrid) to duża, dojrzała siatka. Zespoły, które używają jej głównie jako widoku tabeli z grupowaniem, sumami, filtrowaniem i zapisywanymi układami, mogą obsłużyć ten zakres za pomocą sgcGrid, z pełnym kodem źródłowym, i zrezygnować z subskrypcji, która obejmuje znacznie więcej niż samą siatkę.

Ile dziś kosztuje siatka: 2026-10-20 cennik DevExpress VCL zawierał trzy subskrypcje, wszystkie z kontrolką ExpressQuantumGrid. Najtańsza to Express QuantumPack za 999,99 USD, subskrypcja VCL Subscription kosztuje 1699,99 USD. W wątku na Delphi-PRAXiS z 18 września 2025 jeden użytkownik napisał, że jego subskrypcja cxGrid wzrosła z 400 USD do 550 USD, a inny uczestnik zacytował komunikat DevExpress, że nowe licencje Express GridPack nie są już sprzedawane (aktywni subskrybenci nadal mogą odnawiać). sgcGrid jest licencjonowany na programistę od €199 z pełnym kodem źródłowym i rokiem aktualizacji, a także wchodzi w skład każdej edycji sgcUI.

Jedna kontrolka, powiązana z dowolnym TDataSet

Jeden TsgcVCLGrid i jeden TsgcGridSource_DataSet z właściwościami DataSet, Grid i KeyField. Zdarzenia zestawu danych utrzymują siatkę w aktualnym stanie.

We wszystkich edycjach

Kolumny projektowane i dopasowywane przez FieldName, pola odnośników (lookup), zaznaczanie komórki, wiersza i wielu wierszy, nagłówek wiersza, własne rysowanie, Ctrl+C, panel grupowania, sumy w stopce i w grupach, wiersz filtra, filtr kolumn w stylu Excela, panel wyszukiwania, pasma, automatyczne dopasowanie oraz zapis i wczytywanie układu w formacie JSON.

Tylko edycja Registered

Dwukierunkowa edycja w zestawie danych (WriteBack), synchronizacja kursora (SyncCursor), wstawianie, usuwanie, wklejanie i cofanie, widok kart (ViewStyle) oraz tryb serwerowy dla bardzo dużych tabel. Wersja próbna zawiera je do oceny. Wersja Community ich nie ma: demo mimo to się w niej kompiluje i wyświetla siatki tylko do odczytu.

Elementy TDBGrid i ich odpowiedniki w sgcGrid

Każda poniższa nazwa sgcGrid występuje w dostarczanym kodzie źródłowym, a te, których używa demo, się w nim kompilują.

TDBGrid sgcGrid Edycja
TDBGridTsgcVCLGrid (jednostka sgcGrid_VCL)Wszystkie
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField, a następnie Active := True (jednostka sgcGrid_Source_DataSet)Wszystkie
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Zaprojektowane kolumny są zachowywane i dopasowywane przez FieldName; bez kolumn tworzy je AutoColumnsWszystkie
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleWszystkie
TColumn.ReadOnlyColumns[i].EditableWszystkie (edycja: Registered)
TColumn.PickList, lista rozwijana pola odnośnikaColumns[i].PickList; dla pola odnośnika źródło wypełnia listę z LookupDataSetWszystkie (zapis wartości: Registered)
TField.DisplayFormatColumns[i].DisplayFormatWszystkie
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (domyślnie True) i TsgcGridSource_DataSet.WriteBackRegistered
dgRowSelectSelectionMode := gsmRow (w przeciwnym razie gsmCell)Wszystkie
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Wszystkie
dgIndicatorRowHeader := [grhIndicator] (także grhNumbers, grhCheckBox)Wszystkie
dgColLines, dgRowLinesGridLinesV, GridLinesHWszystkie
Bieżący rekord podąża za siatkąTsgcGridSource_DataSet.SyncCursorRegistered
OnDrawColumnCell, DefaultDrawColumnCellOnCustomDrawCell z aDefaultDraw; do samych kolorów służy OnGetCellStyle lub FormatRulesWszystkie
OnTitleClickOnHeaderClickWszystkie
Ctrl+C (własny kod)Wbudowane (Ctrl+C, Ctrl+Ins); tekst pochodzi z SelectionToTextWszystkie
Klawisze Insert i Ctrl+DeleteAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistered

Elementy cxGrid i ich odpowiedniki w sgcGrid

Nazwy cxGrid to identyfikatory DevExpress, podane wyłącznie orientacyjnie.

cxGrid sgcGrid Edycja
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid i TsgcGridSource_DataSetWszystkie
TcxGridDBColumn.DataBinding.FieldNameColumns[i].FieldNameWszystkie
TcxGridDBColumn.GroupIndexColumns[i].GroupIndex; GroupBy(['Field']), ClearGrouping, GroupCountWszystkie
OptionsView.GroupByBoxShowGroupPanelWszystkie
DataController.Groups.FullExpand, FullCollapseExpandAll, CollapseAllWszystkie
OptionsView.FooterShowFooterWszystkie
DataController.Summary.FooterSummaryItems (skSum, skCount, skAverage, skMin, skMax)Columns[i].SummaryType (gsuSum, gsuCount, gsuAverage, gsuMin, gsuMax), SummaryFormat; wartości z FooterSummary(aCol), FooterSummaryText(aCol); SummaryScopeWszystkie
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, z użyciem SummaryType kolumny w grupachWszystkie
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorWszystkie
Lista rozwijana filtra kolumnyShowFilterButtons, ShowFilterPopup(aCol), ClearColumnFilter(aCol), ClearColumnFilters, OnFilterChangeWszystkie
FindPanel.DisplayModeShowFindPanel, FindText, FindNext, FindPrevious, FindOnlyMatchesWszystkie
TcxGridDBBandedTableView.Bands, Column.Position.BandIndexBands (Caption, ParentBand, Visible), Columns[i].BandWszystkie
ApplyBestFitBestFitColumns, BestFitColumn(aCol), BestFitOnDblClick, BestFitSampleRowsWszystkie
StoreToIniFile, RestoreFromIniFileSaveLayoutToFile, LoadLayoutFromFile (JSON), także do i z ciągu znaków lub strumienia; automatycznie z AutoSaveLayout i LayoutStorageKeyWszystkie
OptionsCustomize.ColumnMovingColumnMovingWszystkie
Okno dostosowywania kolumnShowColumnChooserWszystkie
OnCustomDrawCellOnCustomDrawCellWszystkie
TcxGridDBCardView (drugi widok)ViewStyle := gvsCard w tej samej siatce, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registered

Kod ze skompilowanej wersji demonstracyjnej

Każdy fragment jest skopiowany z demo MigrateFromDBGrid, które kompiluje się w Delphi 7 i Delphi 13 (Win32 i Win64). Komentarze wskazują kod TDBGrid lub cxGrid, który zastępuje.

Wiązanie: DataSource zamienia się w TsgcGridSource_DataSet

Przed: TDBGrid z DataSource := dsProducts. Po: komponent źródła na formularzu.

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

Opcje TDBGrid zamieniają się we właściwości

Przed: Options z dgEditing, dgRowSelect, dgMultiSelect i dgIndicator. Po:

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 zamienia się w OnCustomDrawCell

Przed: OnDrawColumnCell, który odczytuje Column.FieldName i wartość pola. Po: aCol to indeks w Columns, a aRow to wiersz widoku w Data (CS_LOW_STOCK jest stałą 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;

Zapis do zestawu danych, synchronizacja kursora i grupowanie

Przed: dgEditing w TDBGrid oraz kolumna przeciągnięta do GroupByBox w cxGrid. Po:

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

Funkcje widoku tabeli cxGrid w czasie projektowania

Przed: elementy sum w stopce, obszar grupowania, wiersz filtra, panel wyszukiwania i pasmowy widok tabeli. Po: właściwości kolumn i właściwości siatki na formularzu.

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>

Automatyczne dopasowanie, układ i widok kart

Przed: ApplyBestFit, StoreToIniFile, RestoreFromIniFile i TcxGridDBCardView. Po:

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;

Siedem kroków na formularz

Warstwa danych pozostaje bez zmian. Zmienia się tylko siatka i jej opcje.

1

Umieść komponenty

Zainstaluj pakiety sgcGrid, a następnie umieść na formularzu TsgcVCLGrid i TsgcGridSource_DataSet.

2

Wskaż zestaw danych

Ustaw DataSet źródła na zestaw danych, którego używała dotychczasowa siatka (siatka nie potrzebuje już TDataSource), a następnie Grid i KeyField, czyli jedno pole potrzebne do aktualizacji w miejscu i do zapisu.

3

Odtwórz kolumny

Dodaj Columns z FieldName, Caption, Width, DisplayFormat i Editable albo zostaw Columns puste i pozwól, by AutoColumns zbudował je z pól.

4

Przypisz opcje

ReadOnly i WriteBack dla dgEditing, SelectionMode dla dgRowSelect i dgMultiSelect, RowHeader dla dgIndicator, SyncCursor dla bieżącego rekordu.

5

Przenieś kod rysowania

Przenieś kod z OnDrawColumnCell do OnCustomDrawCell albo do OnGetCellStyle, jeśli tylko ustawia kolory.

6

Włącz funkcje cxGrid

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; sumy do Columns[i].SummaryType, pasma do Bands i Columns[i].Band, układy do SaveLayoutToFile.

7

Aktywuj

Ustaw Active := True w źródle po otwarciu zestawu danych.

Co nie odpowiada sobie jeden do jednego

Przeczytaj to przed zaplanowaniem migracji.

MigrateFromDBGrid

TClientDataSet z 40 produktami i polem odnośnika Category, wyświetlony na dwóch stronach: „From TDBGrid” i „From cxGrid”.

Gdzie je znaleźć

Instalator sgcUI umieszcza je w Demos\Grid\Delphi\MigrateFromDBGrid: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm oraz readme.html.

Jak je uruchomić

Otwórz MigrateFromDBGrid.dpr w dowolnym Delphi od 7 do 13, skompiluj dla Win32 lub Win64 i uruchom. Każda strona wskazuje pojęcie z TDBGrid lub cxGrid obok jego odpowiednika w sgcGrid.

Autotest

MigrateFromDBGrid.exe /test sprawdza mapowanie kolumn i opcji, skopiowany tekst, grupowanie, sumę w stopce, pasma, cykl zapisu i odczytu układu, a w edycji Registered także zapis do zestawu danych i widok kart, po czym kończy działanie z kodem 0, gdy wszystkie testy przejdą.

Uczciwie wobec obu siatek: cxGrid oferuje rzeczy, których sgcGrid nie ma, jak wiele widoków i poziomów w jednej kontrolce siatki oraz układy INI, a do tego jest dostarczana z szerokim zestawem innych kontrolek. Jeśli Twoja aplikacja od tego zależy, migracja jest większa, niż pokazuje ta strona. sgcGrid to dobra droga, gdy wymienione wyżej funkcje siatki są tymi, których używasz, i chcesz je mieć z pełnym kodem źródłowym, w Delphi od 7 do 13, w jednym produkcie. Pełną listę funkcji znajdziesz na stronie produktu sgcGrid.

Najkorzystniejsza oferta: All-AccessWszystkie produkty eSeGeCe, ze wsparciem Premium w cenie, już od €1,059 rocznie.
Zobacz cennik All-Access

Przenieś swoją pierwszą siatkę już dziś

Pobierz wersję próbną sgcUI z sgcGrid i demo MigrateFromDBGrid, a następnie przenieś swój pierwszy formularz.