Devexpress components
Skill delphicleancode/delphi-spec-kit/.claude/skills/devexpress-components
An opinionated ecosystem of rules, skills, and steerings to elevate Delphi development to a state-of-the-art level with Artificial Intelligence.
npx -y skills add delphicleancode/delphi-spec-kit --skill devexpress-componentsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Standards for using DevExpress (DEXT) components in Delphi VCL applications
SKILL.md
6.9 KB, as published. Nobody here has run it
DevExpress (DEXT) Components — Skill
Use this skill when developing rich interfaces with DevExpress (DEXT) components for Delphi VCL.
When to Use
- When creating advanced grids with
TcxGrid - When using
TcxDBTreeListfor hierarchical structures - When implementing layout managers (
TdxLayoutControl) - When customizing skins and themes
Main Components
| Component | Usage | Prefix |
|---|---|---|
TcxGrid | Advanced grid with grouping, filters, summaries | grd |
TcxGridDBTableView | Data-aware tabular view | tvw |
TcxGridDBBandedTableView | View with grouped bands/columns | btvw |
TcxGridDBCardView | Card view | cvw |
TcxDBTreeList | TreeList data-aware | trl |
TdxLayoutControl | Responsive layout manager | lyt |
TdxLayoutGroup | Grupo dentro de layout | lgrp |
TdxLayoutItem | Item within layout | litm |
TcxDBTextEdit | Edit text data-aware | edt |
TcxDBComboBox | ComboBox data-aware | cmb |
TcxDBDateEdit | Date picker data-aware | dte |
TcxDBCurrencyEdit | Data-aware currency editor | cur |
TcxDBCheckBox | Checkbox data-aware | chk |
TcxDBLookupComboBox | Lookup combo data-aware | lcb |
TcxDBMemo | Memo data-aware | mmo |
TdxBarManager | Toolbar/ribbon | bar |
TdxRibbon | Ribbon UI | rbn |
TdxNavBar | Navigation Bar | nav |
TdxSkinController | Skin controller | skn |
TcxPageControl | Advanced PageControl | pgc |
TcxGroupBox | Styled GroupBox | grp |
TcxGrid Configuration
//Programmatic column creation
procedure TfrmCustomerList.ConfigureGrid;
var
LView: TcxGridDBTableView;
begin
LView := grdCustomers.Views[0] as TcxGridDBTableView;
LView.DataController.DataSource := dsCustomers;
//Configure behavior
LView.OptionsData.Editing := False; //Read only
LView.OptionsData.Deleting := False;
LView.OptionsData.Inserting := False;
LView.OptionsView.GroupByBox := True; //Visual grouping
LView.OptionsView.Footer := True; //Footer with summaries
LView.OptionsView.Indicator := True; //Line indicator
LView.OptionsCustomize.ColumnFiltering := True;
LView.OptionsCustomize.ColumnSorting := True;
LView.OptionsSelection.MultiSelect := True;
//Configure columns individually
ConfigureColumn(LView.GetColumnByFieldName('name'), 'Nome', 200);
ConfigureColumn(LView.GetColumnByFieldName('cpf'), 'CPF', 120);
ConfigureColumn(LView.GetColumnByFieldName('email'), 'E-mail', 250);
end;
procedure TfrmCustomerList.ConfigureColumn(
AColumn: TcxGridDBColumn; const ACaption: string; AWidth: Integer);
begin
if not Assigned(AColumn) then Exit;
AColumn.Caption := ACaption;
AColumn.Width := AWidth;
AColumn.HeaderAlignmentHorz := taCenter;
end;
Summaries in the Grid
//Footer Summary
procedure ConfigureFooterSummary(AView: TcxGridDBTableView);
var
LSummary: TcxGridDBTableSummaryItem;
begin
AView.DataController.Summary.FooterSummaryItems.Clear;
LSummary := AView.DataController.Summary.FooterSummaryItems.Add
as TcxGridDBTableSummaryItem;
LSummary.FieldName := 'value';
LSummary.Kind := skSum;
LSummary.Format := 'Total: R$ #,##0.00';
LSummary.Column := AView.GetColumnByFieldName('value');
LSummary := AView.DataController.Summary.FooterSummaryItems.Add
as TcxGridDBTableSummaryItem;
LSummary.FieldName := 'id';
LSummary.Kind := skCount;
LSummary.Format := 'Registros: %d';
LSummary.Column := AView.GetColumnByFieldName('name');
end;
TdxLayoutControl (Responsive Layout)
//Form organization with LayoutControl
//Advantages: responsive, automatically repositions, consistent look
procedure TfrmCustomerEdit.ConfigureLayout;
begin
lytMain.BeginUpdate;
try
//Personal data group
lgrpPersonal.Caption := 'Dados Pessoais';
lgrpPersonal.LayoutDirection := ldHorizontal;
//Address group
lgrpAddress.Caption := 'Endereço';
lgrpAddress.LayoutDirection := ldHorizontal;
//Configure items
litmName.Control := edtName;
litmName.CaptionOptions.Text := 'Nome:';
litmName.CaptionOptions.Width := 80;
finally
lytMain.EndUpdate;
end;
end;
Skinning / Themes
//Apply skin globally
uses
dxSkinsCore,
dxSkinOffice2019Colorful; //Specific skin
procedure TfrmMain.ApplySkin;
begin
//Via SkinController (recommended)
sknController.NativeStyle := False;
sknController.SkinName := 'Office2019Colorful';
//OR programmatically
cxLookAndFeelController.NativeStyle := False;
cxLookAndFeelController.SkinName := 'Office2019Colorful';
end;
//Skins populares: 'Office2019Colorful', 'WXI', 'Metropolis',
//'MetropolisDark', 'TheBezier', 'Fluent', 'Office2019DarkGray'
Filters in the Grid
//Programmatic filter
procedure TfrmCustomerList.ApplyFilter(const AField, AValue: string);
var
LView: TcxGridDBTableView;
begin
LView := grdCustomers.Views[0] as TcxGridDBTableView;
LView.DataController.Filter.Root.Clear;
LView.DataController.Filter.Root.AddItem(
LView.GetColumnByFieldName(AField),
foLike,
'%' + AValue + '%',
AValue
);
LView.DataController.Filter.Active := True;
end;
//Clean filter
procedure TfrmCustomerList.ClearFilter;
begin
(grdCustomers.Views[0] as TcxGridDBTableView)
.DataController.Filter.Root.Clear;
end;
Grid Export
uses
cxGridExportLink;
//Export to Excel
procedure TfrmCustomerList.ExportToExcel;
begin
cxGridExportLink.ExportGridToXLSX(
'customers.xlsx',
grdCustomers,
False, // AExpand
True, //AUseNativeFormat
True //AShowProgress
);
end;
//Export to PDF
procedure TfrmCustomerList.ExportToPDF;
begin
cxGridExportLink.ExportGridToPDF(
'customers.pdf',
grdCustomers
);
end;
DEXT Conventions
| Appearance | Convention |
|---|---|
| Prefixes | Follow the table above (grd, tvw, lyt, etc.) |
| Skins | Use TdxSkinController in the main form |
| Layout | Prefer TdxLayoutControl to manual positioning |
| Grid | Configure at FormCreate, never at design-time for dynamic columns |
| Filters | Use DataController.Filter — do not filter via SQL when possible |
| Summaries | Configure FooterSummaryItems instead of calculating manually |
| Exports | Use cxGridExportLink — do not redeploy export |
Checklist for DEXT Projects
-
TdxSkinControllerconfigured in the main form? - Grids configured with
OptionsData(read-only when appropriate)? - Footer summaries configured with BR formats (
R$ #,##0.00)? -
TdxLayoutControlused for editing forms? - Grid columns with
Caption,WidthandAlignment? - Filters using
DataController.Filter(not SQL)? - Export via
cxGridExportLink? - Component prefixes following the standard table?