unit CellLevelMultiselectDemoMain; {$I ..\..\cxVer.inc} interface uses Windows, Forms, Messages, SysUtils, Classes, ActnList, ImgList, Controls, Menus, StdCtrls, cxButtons, cxCheckBox, cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxSpinEdit, ExtCtrls, cxGridLevel, cxGridCustomTableView, cxGridCardView, cxGridDBCardView, cxClasses, cxControls, cxGridCustomView, cxGrid, ComCtrls, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, DB, cxDBData, cxDataStorage, cxLookAndFeelPainters, cxLookAndFeels, cxHyperLinkEdit, cxImageComboBox, cxDBLookupComboBox, cxMemo, cxGridTableView; type TCellLevelMultiselectDemoMainForm = class(TForm) mmMain: TMainMenu; miAbout: TMenuItem; miFile: TMenuItem; miExit: TMenuItem; sbMain: TStatusBar; lbDescrip: TLabel; LookAndFeelController: TcxLookAndFeelController; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; lblSelectedRows: TLabel; lblSelectedColumns: TLabel; lblSelectedCells: TLabel; lblSelectedSummary: TLabel; cxStyleRepository1: TcxStyleRepository; styleSelected: TcxStyle; styleNormal: TcxStyle; Grid: TcxGrid; TableView: TcxGridTableView; Level: TcxGridLevel; procedure miAboutClick(Sender: TObject); procedure miExitClick(Sender: TObject); procedure TableViewSelectionChanged(Sender: TcxCustomGridTableView); procedure TableViewCustomDrawIndicatorCell(Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean); procedure TableViewStylesGetHeaderStyle(Sender: TcxGridTableView; AColumn: TcxGridColumn; out AStyle: TcxStyle); procedure TableViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FAnchorLinkedAreaLastColumn: TcxGridColumn; procedure CreateSpreadSheet; procedure CreateColumns; procedure CreateRows; function GetColumnCaption(Index: Integer): string; procedure SetColumnsSelected(AFromColumn, AToColumn: TcxGridColumn; ASelected: Boolean); public constructor Create(AOwner: TComponent); override; end; var CellLevelMultiselectDemoMainForm: TCellLevelMultiselectDemoMainForm; implementation {$R *.dfm} uses {$IFDEF DELPHI6} Variants, {$ENDIF} Dialogs, AboutDemoForm, cxVariants; const RecordCount = 500; ColumnCount = 256; constructor TCellLevelMultiselectDemoMainForm.Create(AOwner: TComponent); begin inherited Create(AOwner); CreateSpreadSheet; TableView.Controller.SelectCells( TableView.Columns[1], TableView.Columns[5], 2, 12); end; procedure TCellLevelMultiselectDemoMainForm.miAboutClick(Sender: TObject); begin ShowAboutDemoForm; end; procedure TCellLevelMultiselectDemoMainForm.miExitClick(Sender: TObject); begin Close; end; procedure TCellLevelMultiselectDemoMainForm.TableViewSelectionChanged( Sender: TcxCustomGridTableView); function SelectedRowCount: Integer; begin Result := TableView.Controller.SelectedRowCount; end; function SelectedColumnCount: Integer; begin Result := TableView.Controller.SelectedColumnCount; end; function GetSummOfSelection: Integer; var I, J: Integer; val: Variant; begin Result := 0; for I := 0 to SelectedRowCount - 1 do for J := 0 to SelectedColumnCount - 1 do begin val := TableView.DataController.GetValue( TableView.Controller.SelectedRows[I].RecordIndex, TableView.Controller.SelectedColumns[J].Index); if not VarIsNull(val) then Inc(Result, Integer(val)); end; end; begin lblSelectedRows.Caption := FloatToStrF(SelectedRowCount, ffNumber, 15, 0); lblSelectedColumns.Caption := FloatToStrF(SelectedColumnCount, ffNumber, 15, 0); lblSelectedCells.Caption := FloatToStrF(SelectedRowCount * SelectedColumnCount, ffNumber, 15, 0); lblSelectedSummary.Caption := FloatToStrF(GetSummOfSelection, ffNumber, 15, 0); end; procedure TCellLevelMultiselectDemoMainForm.TableViewCustomDrawIndicatorCell( Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean); var AIndicatorViewInfo: TcxGridIndicatorRowItemViewInfo; ATextRect: TRect; AStyle: TcxStyle; begin if not (AViewInfo is TcxGridIndicatorRowItemViewInfo) then Exit; ATextRect := AViewInfo.ContentBounds; AIndicatorViewInfo := AViewInfo as TcxGridIndicatorRowItemViewInfo; InflateRect(ATextRect, -2, -1); if AIndicatorViewInfo.GridRecord.Selected then AStyle := styleSelected else AStyle := styleNormal; Sender.LookAndFeelPainter.DrawHeader(ACanvas, AViewInfo.ContentBounds, ATextRect, [], cxBordersAll, cxbsNormal, taCenter, vaCenter, False, False, IntToStr(AIndicatorViewInfo.GridRecord.Index + 1), AStyle.Font, AStyle.TextColor, AStyle.Color); ADone := True; end; procedure TCellLevelMultiselectDemoMainForm.TableViewStylesGetHeaderStyle( Sender: TcxGridTableView; AColumn: TcxGridColumn; out AStyle: TcxStyle); begin if AColumn = nil then exit; if AColumn.Selected then AStyle := styleSelected else AStyle := styleNormal; end; procedure TCellLevelMultiselectDemoMainForm.CreateSpreadSheet; begin TableView.BeginUpdate; try CreateColumns; CreateRows; finally TableView.EndUpdate; end; end; procedure TCellLevelMultiselectDemoMainForm.CreateColumns; var I: Integer; AColumn: TcxGridColumn; begin for I := 0 to ColumnCount - 1 do begin AColumn := TableView.CreateColumn; AColumn.Caption := GetColumnCaption(I); AColumn.HeaderAlignmentHorz := taCenter; AColumn.DataBinding.ValueType := 'Integer'; end; end; procedure TCellLevelMultiselectDemoMainForm.CreateRows; var I, J: Integer; begin TableView.DataController.RecordCount := RecordCount; Randomize; for I := 0 to RecordCount - 1 do for J := 0 to ColumnCount - 1 do TableView.DataController.SetValue(I, J, Random(100)); end; function TCellLevelMultiselectDemoMainForm.GetColumnCaption(Index: Integer): string; const AlphabetSymbolCount = Integer('Z') - Integer('A') + 1; begin if Index div AlphabetSymbolCount > 0 then Result := GetColumnCaption(Index div AlphabetSymbolCount - 1) else Result := ''; Result := Result + char(Integer('A') + Index mod AlphabetSymbolCount); end; procedure TCellLevelMultiselectDemoMainForm.SetColumnsSelected( AFromColumn, AToColumn: TcxGridColumn; ASelected: Boolean); var I: Integer; AFromColIndex, AToColIndex: Integer; begin AFromColIndex := AFromColumn.VisibleIndex; AToColIndex := AToColumn.VisibleIndex; if AFromColIndex > AToColIndex then begin I := AToColIndex; AToColIndex := AFromColIndex; AFromColIndex := I; end; TableView.BeginUpdate; try for I := AFromColIndex to AToColIndex do TableView.VisibleColumns[I].Selected := ASelected; finally TableView.EndUpdate; end; end; procedure TCellLevelMultiselectDemoMainForm.TableViewMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var AHitTest: TcxCustomGridHitTest; AColumn: TcxGridColumn; begin AHitTest := TableView.GetHitTest(X, Y); if not (AHitTest is TcxGridColumnHeaderHitTest) then Exit; AColumn := (AHitTest as TcxGridColumnHeaderHitTest).Column; TableView.BeginUpdate; try if ssShift in Shift then begin SetColumnsSelected(TableView.Controller.CellSelectionAnchor, FAnchorLinkedAreaLastColumn, False); SetColumnsSelected(TableView.Controller.CellSelectionAnchor, AColumn, True); end else begin if ssCtrl in Shift then AColumn.Selected := True else TableView.Controller.SelectColumns(AColumn, AColumn); AColumn.Focused := True; TableView.Controller.CellSelectionAnchor := AColumn; end; TableView.DataController.SelectAll; FAnchorLinkedAreaLastColumn := AColumn; finally TableView.EndUpdate; end; end; end.