unit DBXBGrid;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGridEh, Menus, DBGrids, dbclient, DBGridEhImpExp, Db;
Const    ClipSize = 30; //剪贴板大小
type
  TClipBuffer = Class(TObject)
  public
    FieldBuffer: array[0..ClipSize-1, 0..ClipSize-1] of string;
    PreRowValue:array[0..ClipSize-1] of string; //增加新行时,使用的复制行
    ColCount: integer;
    RowCount: integer;
    CopyType: integer; //0:gstNon; 1:gstRectangle; 2:gstRecordBooks; 3:gstAll;
    constructor Create;
  end;  TDBXBGrid = class(TCustomDBGridEh)
  private
  FUseGridStyle: Boolean; //是否使用交替颜色显示改字段的行
   FPickOnly: Boolean;    FClipBuffer:TClipBuffer;
    FGridStyleIndex: integer;    procedure SetGridStyle(const Value: integer);
  protected
    procedure GetCellParams(Column: TColumnEh; AFont: TFont;
      var Background: TColor; State: TGridDrawState);
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;
  public
    property GridHeight;
    property RowCount;
    property Canvas;
    property SelectedRows;
    constructor Create(AOwner: TComponent);override;
    destructor Destroy;override;  published
    property GridStyleIndex: Integer read FGridStyleIndex write SetGridStyle default 0; //为0时,表示不使用风格
    //property CanEdit: Boolean read FCanEdit write FCanEdit default True; //用来指示网格的弹出菜单是否包含编辑菜单项    property Align;
    property AllowedOperations;
    property AllowedSelections;
    property Anchors;
    property AutoFitColWidths;
    property BiDiMode;
    property BorderStyle;
    property Color;
    property ColumnDefValues;
    property Columns stored False; //StoreColumns;
    property Constraints;
    property Ctl3D;
    property DataSource;
    property DefaultDrawing;
    property DragCursor;
    property DragKind;
    property DragMode;
    property DrawMemoText;
    property EditActions;
    property Enabled;
    property FixedColor;
    property Flat;
    property Font;
    property FooterColor;
    property FooterFont;
    property FooterRowCount;
    property FrozenCols;
    property HorzScrollBar;
    property ImeMode;
    property ImeName;
    property MinAutoFitWidth;
    property Options;
    property OptionsEh;
    property ParentBiDiMode;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ReadOnly;
    property RowHeight;
    property RowLines;
    property RowSizingAllowed;
    property ShowHint;
    property SumList;
    property TabOrder;
    property TabStop;
    property TitleFont;
    property TitleHeight;
    property TitleImages;
    property TitleLines;
    property UseMultiTitle;
    property VertScrollBar;
    property Visible;
    property VTitleMargin;
//    property HTitleMargin;
    property OnCellClick;
    property OnCheckButton;
    property OnColEnter;
    property OnColExit;
    property OnColumnMoved;
    property OnColWidthsChanged;
    //property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnDrawColumnCell;
    property OnDrawDataCell; { obsolete }
    property OnDrawFooterCell;
    property OnEditButtonClick;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnGetBtnParams;
    property OnGetCellParams;
    property OnGetFooterParams;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnSortMarkingChanged;
    property OnStartDock;
    property OnStartDrag;
    property OnSumListAfterRecalcAll;
    property OnSumListRecalcAll;
    property OnTitleBtnClick;
    property OnTitleClick;
  end;
procedure Register;implementationconstructor TClipBuffer.Create;
var
    i, j: integer;
begin
  inherited Create;
  ColCount := 0;
  RowCount := 0;
  CopyType := 0;
  for j := 0 to ClipSize - 1 do
    for i := 0 to ClipSize - 1 do
    FieldBuffer[j][i] := '';
  for j := 0 to ClipSize - 1 do
    PreRowValue[j]:='';
end;constructor TDBXBGrid.Create(AOwner: TComponent);
var
    i: integer;
begin
  inherited Create(AOwner);
  //初始化DBGrid
  Options:=Options+[dgMultiSelect];
  OPtionsEh:=OptionsEh+[dghEnterAsTab];  //初始化剪贴板
  FClipBuffer:=TClipBuffer.Create;end;destructor TDBXBGrid.Destroy;begin  FClipBuffer.Free;
  inherited Destroy;
end;
//属性GridStyleIndex的写方法
procedure TDBXBGrid.SetGridStyle(const Value: integer);
var
    i: integer;
begin
    if FGridStyleIndex <> Value then
    begin
        FGridStyleIndex := Value;
        Case FGridStyleIndex of
            1:
            begin
                FixedColor := $008CB4D2;
                for i:=0 to self.Columns.Count-1 do
                begin
                    self.Columns[i].Color:=$00D2FAFA;
                    self.Columns[i].Font.Color:=clBlack;
                    Self.TitleFont.Color:=clBlack;
                end;
            end;
            2:
            begin
                FixedColor := $008C3C4A;
                for i:=0 to self.Columns.Count-1 do
                begin
                    self.Columns[i].Color:=$00FFE7E7;
                    self.Columns[i].Font.Color:=$8C3C4A;
                    Self.TitleFont.Color:=clWhite;
                end;
            end;
            3:
            begin
                FixedColor := $6B696B;
                for i:=0 to self.Columns.Count-1 do
                begin
                    self.Columns[i].Color:=$DEF7F7;
                    self.Columns[i].Font.Color:=clBlack;
                    Self.TitleFont.Color:=clWhite;
                end;
            end;
        end;
        self.Invalidate;
    end;
end;//重载GetCellParams事件,按指定的网格风格给数据行绘制交替颜色
//要使用此功能,首先要设置网格的GridStyleIndex, 然后设置网格列的UseAlterColor属性
procedure TDBXBGrid.GetCellParams(Column: TColumnEh; AFont: TFont;
      var Background: TColor; State: TGridDrawState);
begin
    if Column.UseGridStyle then
    Case FGridStyleIndex of
        1:
        begin
            if not (gdSelected in State) then
            begin
                if SumList.RecNo mod 2 = 0 then
                    Background := $00AAE8EE   //第二种颜色
                else Background := $00D2FAFA; //第一种颜色
            end;
        end;
        2:
        begin
            if not (gdSelected in State) then
            begin
                if SumList.RecNo mod 2 = 0 then
                    Background := $00F7F7F7   //第二种颜色
                else Background := $00FFE7E7; //第一种颜色
            end;
        end;
        3:
        begin
            if not (gdSelected in State) then
            begin
                if SumList.RecNo mod 2 = 0 then
                    Background := clWhite   //第二种颜色
                else Background := $DEF7F7; //第一种颜色
            end;
        end;
    end;
    inherited GetCellParams(Column, AFont, Background, State);
end;procedure TDBXBGrid.KeyPress(var Key: Char);
begin
    inherited;
    if Columns[SelectedIndex].PickOnly then Key:=#0;
end;//****************************************************************//
procedure Register;
begin
  RegisterComponents('Data Controls', [TDBXBGrid]);
end;end.