Skip to main content
TeeBI grids provide powerful data display with automatic binding and interactive features.

Basic Grid Usage

uses
  BI.DataItem, BI.Persist,
  VCLBI.Grid;

type
  TForm1 = class(TForm)
    BIGrid1: TBIGrid;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Data: TDataItem;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Load and display data
  Data := TStore.Load('BISamples', 'Products');
  BIGrid1.Data := Data;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Data.Free;
end;

Grid Features

// Alternating row colors
BIGrid1.Alternate.Enabled := True;
BIGrid1.Alternate.Color := clSilver;

// Hide duplicate values in grouped data
BIGrid1.Duplicates(Data['Category'], True);

// Read-only
BIGrid1.ReadOnly := True;

// Multi-select
BIGrid1.Options := BIGrid1.Options + [dgMultiSelect];

Colorizing Cells

uses VCLBI.Grid;

procedure ColorizeCells;
var
  Colorizers: TDataColorizers;
begin
  SetLength(Colorizers, 1);

  // Colorize by value
  Colorizers[0].Data := Data['Stock'];
  Colorizers[0].Colors.Inverted := False;  // High values = darker
  Colorizers[0].TextColor := TColorizeTextColor.Automatic;
  Colorizers[0].Mode := TColorizeMode.Full;  // Or .Left for bar

  BIGrid1.Colorize(Colorizers);
end;

// Custom color scheme
procedure CustomColors;
var
  Colorizers: TDataColorizers;
begin
  SetLength(Colorizers, 1);

  Colorizers[0].Data := Data['Value'];
  Colorizers[0].Colors.Clear;
  Colorizers[0].Colors.Add(0, clRed);     // Min value
  Colorizers[0].Colors.Add(0.5, clYellow); // Middle
  Colorizers[0].Colors.Add(1, clGreen);   // Max value

  BIGrid1.Colorize(Colorizers);
end;

Grid Editor

uses VCLBI.Editor.BIGrid;

// Show grid editor dialog
procedure ShowGridEditor;
begin
  TBIGridEditor.Edit(Self, BIGrid1);
end;

// Embedd editor in a panel
var
  Editor: TBIGridEditor;
begin
  Editor := TBIGridEditor.Embedd(Self, Panel1, BIGrid1);
end;

Filtering Grid Data

uses BI.Expression;

// Apply filter expression
procedure FilterGrid;
var
  Filter: TExpression;
begin
  Filter := TDataFilter.FromString(
    Data,
    '(UnitPrice > 50) and (Stock > 0)',
    nil  // Error handler
  );

  if Filter <> nil then
  try
    BIGrid1.Filter := Filter;
  finally
    Filter.Free;
  end;
end;

// Clear filter
BIGrid1.Filter := nil;

Refresh Grid Data

// Refresh after data changes
BIGrid1.RefreshData;

// Rebind to new data
procedure ChangeData;
var
  NewData: TDataItem;
begin
  NewData := TBISQL.From(OriginalData, 'top 100 *');
  BIGrid1.Data.Free;
  BIGrid1.Data := NewData;
end;

Using with TDataSet/TDataSource

uses BI.DataSet, Data.DB;

type
  TForm1 = class(TForm)
    BIDataSet1: TBIDataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;  // Standard VCL DBGrid
    procedure FormCreate(Sender: TObject);
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // BIDataSet bridges TeeBI to standard DB controls
  BIDataSet1.Data := TStore.Load('BISamples', 'Products');
  BIDataSet1.Open;

  // Standard DBGrid works automatically
  DataSource1.DataSet := BIDataSet1;
  DBGrid1.DataSource := DataSource1;
end;

Custom Column Formatting

uses VCLBI.Grid.DBGrid;

// Access underlying DBGrid
procedure FormatColumns;
var
  Grid: TBIDBGrid;
begin
  Grid := BIGrid1.Plugin.GetObject as TBIDBGrid;

  // Format currency column
  Grid.Fields[2].DisplayFormat := '$#,##0.00';

  // Change column title
  Grid.Fields[0].DisplayLabel := 'Product Name';

  // Set column width
  Grid.Columns[1].Width := 120;
end;

Export Grid Data

uses BI.CSV, BI.Excel, BI.HTML;

// Export to CSV
procedure ExportToCSV;
var
  CSV: String;
begin
  CSV := TBICSVExport.AsString(BIGrid1.Data);
  Memo1.Text := CSV;
  // Or save to file
  TBICSVExport.SaveToFile(BIGrid1.Data, 'export.csv');
end;

// Export to Excel
procedure ExportToExcel;
begin
  TBIExcelExport.SaveToFile(BIGrid1.Data, 'export.xlsx');
end;

// Export to HTML
procedure ExportToHTML;
var
  HTML: String;
begin
  HTML := TBIHTMLExport.AsString(BIGrid1.Data);
  WebBrowser1.LoadFromString(HTML);
end;

Grid with Master-Detail

See Master-Detail for complete examples.

TeeGrid Integration

{$DEFINE USE_TEEGRID}

uses
  {$IFDEF USE_TEEGRID}
  VCLBI.Grid.TeeGrid,  // Use TeeGrid instead of DBGrid
  Tee.Grid.Columns,
  {$ENDIF}
  VCLBI.Grid;

procedure UseTeeGrid;
var
  Grid: TBITeeGrid;
begin
  {$IFDEF USE_TEEGRID}
  Grid := BIGrid1.Plugin.GetObject as TBITeeGrid;
  Grid.Columns[0].Width.Value := 150;
  Grid.ReadOnly := True;
  {$ENDIF}
end;

Complete Example: Interactive Grid

uses
  BI.DataItem, BI.SQL, BI.Persist,
  VCLBI.Grid, VCLBI.Editor.BIGrid,
  BI.Expression.Filter, VCLBI.Editor.DynamicFilter;

type
  TGridForm = class(TForm)
    BIGrid1: TBIGrid;
    Panel1: TPanel;
    BtnEdit: TButton;
    BtnFilter: TButton;
    BtnExport: TButton;
    CBAlternate: TCheckBox;
    CBColorize: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure BtnEditClick(Sender: TObject);
    procedure BtnFilterClick(Sender: TObject);
    procedure BtnExportClick(Sender: TObject);
    procedure CBAlternateClick(Sender: TObject);
    procedure CBColorizeClick(Sender: TObject);
  private
    Data: TDataItem;
    Filter: TBIFilter;
    procedure ApplyColorization;
  end;

procedure TGridForm.FormCreate(Sender: TObject);
begin
  // Load data
  Data := TStore.Load('BISamples', 'Products');
  BIGrid1.Data := Data;

  // Create filter
  Filter := TBIFilter.Create;

  // Enable features
  BIGrid1.Alternate.Enabled := True;
  ApplyColorization;
end;

procedure TGridForm.FormDestroy(Sender: TObject);
begin
  Data.Free;
  Filter.Free;
end;

procedure TGridForm.BtnEditClick(Sender: TObject);
begin
  TBIGridEditor.Edit(Self, BIGrid1);
end;

procedure TGridForm.BtnFilterClick(Sender: TObject);
begin
  TDynamicFilterEditor.Edit(Self, Filter, Data);
  BIGrid1.Filter := Filter.Filter;
end;

procedure TGridForm.BtnExportClick(Sender: TObject);
var
  CSV: String;
begin
  CSV := TBICSVExport.AsString(BIGrid1.Data);
  Clipboard.AsText := CSV;
  ShowMessage('Exported to clipboard');
end;

procedure TGridForm.CBAlternateClick(Sender: TObject);
begin
  BIGrid1.Alternate.Enabled := CBAlternate.Checked;
end;

procedure TGridForm.CBColorizeClick(Sender: TObject);
begin
  ApplyColorization;
end;

procedure TGridForm.ApplyColorization;
var
  Colorizers: TDataColorizers;
begin
  if CBColorize.Checked then
  begin
    SetLength(Colorizers, 1);
    Colorizers[0].Data := Data['UnitPrice'];
    Colorizers[0].Colors.Inverted := False;
    Colorizers[0].TextColor := TColorizeTextColor.Automatic;
    Colorizers[0].Mode := TColorizeMode.Full;
    BIGrid1.Colorize(Colorizers);
  end
  else
    BIGrid1.Colorize(nil);
end;

Grid Events

uses VCLBI.Grid.DBGrid;

// Access DBGrid events
procedure SetupEvents;
var
  DBGrid: TBIDBGrid;
begin
  DBGrid := BIGrid1.Plugin.GetObject as TBIDBGrid;
  DBGrid.OnDblClick := GridDoubleClick;
  DBGrid.OnDrawColumnCell := GridDrawColumnCell;
end;

procedure TForm1.GridDoubleClick(Sender: TObject);
var
  DBGrid: TBIDBGrid;
begin
  DBGrid := Sender as TBIDBGrid;
  ShowMessage('Row: ' + IntToStr(DBGrid.TopRow));
end;

Performance Tips

Large Datasets

For grids with 10,000+ rows:
  • Disable alternating colors
  • Disable colorization
  • Use pagination with TOP/OFFSET

Refresh Strategy

BIGrid1.BeginUpdate;
try
  // ... make changes ...
finally
  BIGrid1.EndUpdate;
end;

Memory Management

Always free grid data when done:
BIGrid1.Data.Free;

Virtual Mode

Use TeeGrid for virtual scrolling with millions of rows

See Also

Build docs developers (and LLMs) love