TDBGrid ve cxGrid'den sgcGrid'e Geçiş

sgcGrid, herhangi bir TDataSet ile bağlanan ve her sürümde gruplama, özetler, filtreleme, bir arama paneli, bantlar ve kaydedilebilir yerleşimler sunan bir VCL veri grid'idir, TsgcVCLGrid. Bu set, kullandığınız her TDBGrid ve cxGrid üyesini sgcGrid karşılığıyla eşleştirir, derlenen bir demodan kodu gösterir ve nelerin eşleşmediğini dürüstçe listeler.

İki Başlangıç Noktası, Tek Grid

Hazır TDBGrid kullanan Delphi VCL ekipleri ve aboneliğini gözden geçiren DevExpress cxGrid kullanan ekipler.

TDBGrid'den

Hazır VCL TDBGrid bir veri kümesini gösterir ve düzenler, ama yapabildiği bu kadardır. Filtre satırı, sütun filtresi, gruplama, alt bilgi veya grup özetleri, arama paneli, bantlar, en iyi sığdırma, yerleşim kaydetme ve yükleme yoktur. Bunların her biri özel kod ya da üçüncü taraf bir grid gerektirir. sgcGrid hepsini tek bir denetimde, zaten elinizde olan veri kümesine bağlı olarak sunar.

cxGrid'den

DevExpress cxGrid (ExpressQuantumGrid) kapsamlı ve olgun bir grid'dir. Onu çoğunlukla gruplama, özetler, filtreleme ve kaydedilebilir yerleşimlerle bir tablo görünümü olarak kullanan ekipler bu kümeyi tam kaynak koduyla sgcGrid ile karşılayabilir ve grid'den çok daha fazlasını kapsayan bir abonelikten vazgeçebilir.

Grid'in bugünkü maliyeti: 2026-10-20 tarihinde DevExpress VCL fiyat listesi üç abonelik sunuyordu ve hepsinde ExpressQuantumGrid Control vardı. En ucuzu 999,99 USD olan Express QuantumPack, VCL Subscription ise 1.699,99 USD. 18 Eylül 2025 tarihli bir Delphi-PRAXiS başlığında bir kullanıcı cxGrid aboneliğinin 400 USD'den 550 USD'ye çıktığını bildirdi, başka bir üye de yeni Express GridPack lisanslarının artık satılmadığına dair bir DevExpress duyurusunu aktardı (etkin aboneler yenilemeye devam edebilir). sgcGrid, tam kaynak kodu ve bir yıllık güncellemeyle geliştirici başına €199 fiyatından lisanslanır ve ayrıca her sgcUI sürümünün parçasıdır.

Tek Denetim, Herhangi Bir TDataSet'e Bağlı

DataSet, Grid ve KeyField özellikleriyle bir TsgcVCLGrid ve bir TsgcGridSource_DataSet. Veri kümesi olayları grid'i güncel tutar.

Her sürümde

FieldName ile eşleşen tasarlanmış sütunlar, arama alanları, hücre, satır ve çok satırlı seçim, satır başlığı, özel çizim, Ctrl+C, gruplama paneli, alt bilgi ve grup özetleri, filtre satırı, Excel tarzı sütun filtresi, arama paneli, bantlar, en iyi sığdırma ve JSON yerleşim kaydetme ve yükleme.

Yalnızca Registered sürümü

Veri kümesine çift yönlü düzenleme (WriteBack), imleç eşitleme (SyncCursor), ekleme, silme, yapıştırma ve geri alma, kart görünümü (ViewStyle) ve çok büyük tablolar için sunucu modu. Deneme sürümü bunları değerlendirme için içerir. Community derlemesinde yoktur: demo orada yine de derlenir ve grid'lerini salt okunur gösterir.

TDBGrid Üyeleri, sgcGrid Karşılıkları

Aşağıdaki her sgcGrid adı gönderilen kaynakta bulunur ve demonun kullandıkları onunla derlenir.

TDBGrid sgcGrid Sürüm
TDBGridTsgcVCLGrid (birim sgcGrid_VCL)Tümü
DataSourceTsgcGridSource_DataSet: DataSet, Grid, KeyField, ardından Active := True (birim sgcGrid_Source_DataSet)Tümü
Columns, TColumn.FieldNameColumns, Columns[i].FieldName. Tasarlanan sütunlar korunur ve FieldName ile eşleştirilir; sütun yoksa AutoColumns bunları oluştururTümü
Title.Caption, Width, VisibleColumns[i].Caption, Width, VisibleTümü
TColumn.ReadOnlyColumns[i].EditableTümü (düzenleme: Registered)
TColumn.PickList, arama alanı açılır listesiColumns[i].PickList; bir arama alanı için kaynak listeyi LookupDataSet üzerinden doldururTümü (değeri yazma: Registered)
TField.DisplayFormatColumns[i].DisplayFormatTümü
ReadOnly, Options dgEditingTsgcVCLGrid.ReadOnly (varsayılan True) ve TsgcGridSource_DataSet.WriteBackRegistered
dgRowSelectSelectionMode := gsmRow (olmadan gsmCell)Tümü
dgMultiSelect, SelectedRowsSelectionMode := gsmMultiRow; SelectedRows, SelectedRowCount, GetSelectedKeys, RowSelected[]Tümü
dgIndicatorRowHeader := [grhIndicator] (ayrıca grhNumbers, grhCheckBox)Tümü
dgColLines, dgRowLinesGridLinesV, GridLinesHTümü
Geçerli kayıt grid'i izlerTsgcGridSource_DataSet.SyncCursorRegistered
OnDrawColumnCell, DefaultDrawColumnCellaDefaultDraw ile OnCustomDrawCell; yalnızca renkler için OnGetCellStyle veya FormatRulesTümü
OnTitleClickOnHeaderClickTümü
Ctrl+C (özel kod)Yerleşik (Ctrl+C, Ctrl+Ins); metin SelectionToText ile gelirTümü
Insert ve Ctrl+Del tuşlarıAllowInsert, AllowDelete, InsertRow, DeleteSelectedRows, OnBeforeDeleteRegistered

cxGrid Üyeleri, sgcGrid Karşılıkları

cxGrid adları DevExpress tanımlayıcılarıdır, yalnızca yön göstermek için verilmiştir.

cxGrid sgcGrid Sürüm
TcxGridDBTableView, DataController.DataSourceTsgcVCLGrid ve TsgcGridSource_DataSetTümü
TcxGridDBColumn.DataBinding.FieldNameColumns[i].FieldNameTümü
TcxGridDBColumn.GroupIndexColumns[i].GroupIndex; GroupBy(['Field']), ClearGrouping, GroupCountTümü
OptionsView.GroupByBoxShowGroupPanelTümü
DataController.Groups.FullExpand, FullCollapseExpandAll, CollapseAllTümü
OptionsView.FooterShowFooterTümü
DataController.Summary.FooterSummaryItems (skSum, skCount, skAverage, skMin, skMax)Columns[i].SummaryType (gsuSum, gsuCount, gsuAverage, gsuMin, gsuMax), SummaryFormat; değerler FooterSummary(aCol), FooterSummaryText(aCol) ile alınır; SummaryScopeTümü
DataController.Summary.DefaultGroupSummaryItemsGroupSummaries, gruplarda sütunun SummaryType değerini kullanırTümü
FilterRow.VisibleShowFilterRow, Columns[i].FilterRowOperatorTümü
Sütun filtresi açılır listesiShowFilterButtons, ShowFilterPopup(aCol), ClearColumnFilter(aCol), ClearColumnFilters, OnFilterChangeTümü
FindPanel.DisplayModeShowFindPanel, FindText, FindNext, FindPrevious, FindOnlyMatchesTümü
TcxGridDBBandedTableView.Bands, Column.Position.BandIndexBands (Caption, ParentBand, Visible), Columns[i].BandTümü
ApplyBestFitBestFitColumns, BestFitColumn(aCol), BestFitOnDblClick, BestFitSampleRowsTümü
StoreToIniFile, RestoreFromIniFileSaveLayoutToFile, LoadLayoutFromFile (JSON), ayrıca bir dizeye veya akışa ve bunlardan; AutoSaveLayout ve LayoutStorageKey ile otomatikTümü
OptionsCustomize.ColumnMovingColumnMovingTümü
Sütun özelleştirme iletişim kutusuShowColumnChooserTümü
OnCustomDrawCellOnCustomDrawCellTümü
TcxGridDBCardView (ikinci bir görünüm)Aynı grid üzerinde ViewStyle := gvsCard, CardOptions (CaptionField, CardWidth, CardHeight, ShowFieldCaptions)Registered

Kod, Derlenen Demodan

Her alıntı, Delphi 7 ve Delphi 13 ile (Win32 ve Win64) derlenen MigrateFromDBGrid demosundan kopyalanmıştır. Yorumlar, yerine geçtikleri TDBGrid veya cxGrid kodunu belirtir.

Bağlama: DataSource, bir TsgcGridSource_DataSet olur

Önce: DataSource := dsProducts olan bir TDBGrid. Sonra: formdaki kaynak bileşeni.

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

TDBGrid seçenekleri özellik olur

Önce: dgEditing, dgRowSelect, dgMultiSelect ve dgIndicator içeren Options. Sonra:

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, OnCustomDrawCell olur

Önce: Column.FieldName ve alan değerini okuyan OnDrawColumnCell. Sonra: aCol Columns dizinidir, aRow ise Data görünümünün satırıdır (CS_LOW_STOCK demonun bir sabitidir).

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;

Geri yazma, imleç eşitleme ve gruplama

Önce: TDBGrid üzerinde dgEditing ve cxGrid GroupByBox'a sürüklenen bir sütun. Sonra:

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

Tasarım zamanında cxGrid tablo görünümü özellikleri

Önce: alt bilgi özet öğeleri, gruplama kutusu, filtre satırı, arama paneli ve bantlı bir tablo görünümü. Sonra: formdaki sütun özellikleri ve grid özellikleri.

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>

En iyi sığdırma, yerleşim ve kart görünümü

Önce: ApplyBestFit, StoreToIniFile, RestoreFromIniFile ve bir TcxGridDBCardView. Sonra:

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;

Form Başına Yedi Adım

Veri katmanı olduğu gibi kalır. Yalnızca grid ve seçenekleri değişir.

1

Bileşenleri bırakın

sgcGrid paketlerini kurun, ardından forma bir TsgcVCLGrid ve bir TsgcGridSource_DataSet bırakın.

2

Veri kümesine yönlendirin

Kaynağın DataSet özelliğini eski grid'in kullandığı veri kümesine ayarlayın (grid artık TDataSource gerektirmez), ardından Grid ve KeyField özelliklerini ayarlayın; KeyField, yerinde güncellemeler ve geri yazma için gereken benzersiz bir alandır.

3

Sütunları yeniden oluşturun

FieldName, Caption, Width, DisplayFormat ve Editable ile Columns ekleyin ya da Columns boş kalsın ve AutoColumns bunları alanlardan oluştursun.

4

Seçenekleri eşleştirin

dgEditing için ReadOnly ve WriteBack, dgRowSelect ve dgMultiSelect için SelectionMode, dgIndicator için RowHeader, geçerli kayıt için SyncCursor.

5

Çizim kodunu taşıyın

OnDrawColumnCell kodunu OnCustomDrawCell olayına taşıyın, yalnızca renk ayarlıyorsa OnGetCellStyle olayına.

6

cxGrid özelliklerini açın

ShowGroupPanel, ShowFooter, GroupSummaries, ShowFilterRow, ShowFilterButtons, ShowFindPanel; özetler Columns[i].SummaryType özelliğine, bantlar Bands ve Columns[i].Band özelliklerine, yerleşimler SaveLayoutToFile yöntemine.

7

Etkinleştirin

Veri kümesi açıldığında kaynakta Active := True ayarlayın.

Birebir Eşleşmeyenler

Geçişi planlamadan önce bunu okuyun.

MigrateFromDBGrid

Bir Category arama alanı olan 40 ürünlük tek bir TClientDataSet, iki sayfada gösterilir: "From TDBGrid" ve "From cxGrid".

Nerede

sgcUI yükleyicisi bunu Demos\Grid\Delphi\MigrateFromDBGrid klasörüne koyar: MigrateFromDBGrid.dpr, frmMain.pas, frmMain.dfm ve bir readme.html.

Nasıl çalıştırılır

MigrateFromDBGrid.dpr dosyasını 7 ile 13 arasındaki herhangi bir Delphi'de açın, Win32 veya Win64 için derleyin ve çalıştırın. Her sayfa, TDBGrid veya cxGrid kavramını sgcGrid karşılığının yanında adlandırır.

Kendini sınama

MigrateFromDBGrid.exe /test sütun ve seçenek eşleştirmesini, kopyalanan metni, gruplamayı, alt bilgi özetini, bantları, yerleşim gidiş dönüşünü ve Registered sürümünde geri yazmayı ve kart görünümünü denetler, ardından tüm denetimler geçtiyse 0 koduyla çıkar.

Her iki grid'e de adil olmak gerekirse: cxGrid, sgcGrid'de bulunmayan şeyler sunar, örneğin tek bir grid denetiminde birden çok görünüm ve düzey ile INI yerleşimleri, ve büyük bir diğer denetimler paketiyle birlikte gelir. Uygulamanız bunlara bağlıysa geçiş bu sayfanın gösterdiğinden büyüktür. Yukarıda listelenen grid özelliklerini kullanıyorsanız ve bunları tam kaynak koduyla, Delphi 7 ile 13 arasında, tek bir ürün olarak istiyorsanız yol sgcGrid'dir. Özelliklerin tam listesi için sgcGrid ürün sayfasına bakın.

En avantajlı seçenek: All-AccessTüm eSeGeCe ürünleri, Premium Destek dahil, yılda €1,059'dan itibaren.
All-Access fiyatlarına bakın

İlk Grid'inizi Bugün Taşıyın

sgcGrid ve MigrateFromDBGrid demosunu içeren sgcUI deneme sürümünü indirin ve ilk formunuzu taşıyın.