procedure TFrm_Appoint.FormCreate(Sender: TObject);
Var
        i:integer;
        DBGridEh_Name:string;
        Str_SQL:string;
        Str_Temp:string;
begin      For i:=0 To Self.ComponentCount-1 do                             //设置TDBGridEh格式
            if Self.Components[i] is TDBGrid Then
                  raise Exception.Create('Program Error:Only Uses DBGridEh!')          //异常处理
            else  if self.Components[i] is TDBGridEh Then
            Begin
                  TDBGridEh(Components[i]).OnDrawColumnCell:=grdDrawColumnCell;        //把数据行显示方法赋给表格
            End;end;
Procedure TFrm_Appoint.grdDrawColumnCell(Sender:Tobject;
         const Rect:TRect;DataCol:Integer;Column:TColumnEh;
                State:TGridDrawState);
Begin
With TDBGridEh(Sender) do                                                    //如果对象是 TDBGridEh,进行下边的操作
  Begin
       if ((State=[gdSelected])or(State=[gdSelected,gdFocused])) Then   //设置被选中单元格的颜色
       Begin
            Canvas.Brush.Color:=$00C08080;                              //笔刷设置背景色
       End
       Else
       Begin                                                           // 根据数据集单双行设置不同的颜色
            if DataSource.DataSet.RecNo mod 2<> 0 Then
               Canvas.Brush.Color:=clWhite
            else
                Canvas.Brush.Color:=$00CFFEFD;
       End;
       DefaultDrawColumnCell(Rect,DataCol,Column,State);
  End;
End;procedure TFrm_Appoint.DBGridSingle_RDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
begin
  inherited;
      if SP_Period.FieldByName('menCount').AsString=SP_Period.FieldByName('realCount').AsString then
      begin
            DBGridSingle_R.Canvas.Font.Color := clRed;
            DBGridSingle_R.DefaultDrawColumnCell(Rect,DataCol,Column,State);
      end;end;
我必须要把 OnCreate中  TDBGridEh(Components[i]).OnDrawColumnCell:=grdDrawColumnCell; 注释掉,
procedure TFrm_Appoint.DBGridSingle_RDrawColumnCell 里边的代码才起作用。着色,是不是有个顺序啊?   我本希望有些代码可以共用

解决方案 »

  1.   

    procedure TFrm_Appoint.DBGridSingle_RDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumnEh;
      State: TGridDrawState);
    begin
      inherited;
          With DBGridSingle_R do                                                    //如果对象是 TDBGridEh,进行下边的操作
          Begin
               if ((State=[gdSelected])or(State=[gdSelected,gdFocused])) Then   //设置被选中单元格的颜色
               Begin
                    Canvas.Brush.Color:=$00C08080;                              //笔刷设置背景色
               End
               Else
               Begin                                                           // 根据数据集单双行设置不同的颜色
                    if DataSource.DataSet.RecNo mod 2<> 0 Then
                       Canvas.Brush.Color:=clWhite
                    else
                        Canvas.Brush.Color:=$00CFFEFD;
               End;
               DefaultDrawColumnCell(Rect,DataCol,Column,State);
          End;      if SP_Period.FieldByName('menCount').AsString=SP_Period.FieldByName('realCount').AsString then
          begin
                DBGridSingle_R.Canvas.Font.Color := clRed;
                DBGridSingle_R.DefaultDrawColumnCell(Rect,DataCol,Column,State);
          end;end;
    我现在只有写在一起,有什么办法可以让不同的表格,享用相同的代码段吗?
      

  2.   

    楼主,DBGrid着色不需要在Form的create事件里面写代码。如果说希望共享代码,可以挂接相同的事件。
    或者将DBGrid做为参数传入
      

  3.   

     让不同的表格,享用相同的代码段:
    1.TDBGridEh(Components[i]).OnDrawColumnCell:=grdDrawColumnCell; 这个方法就是啊
    2.或者写成函数,在每个DrawColumnCell中调用
    3.如果是继承窗体的话:用grdDrawColumnCell事件上加上Virtual,和OverRide可以解决
      

  4.   

    DBGrid着色不需要在Form的create事件里面写代码。这个问题应该不存在
      

  5.   

    Column.Field.FieldName判断列,行的话通过DataCol来判断