如何控制DBGrid中单元格的颜色?

解决方案 »

  1.   

    要改变DBGrid每一行的颜色,只要在ONDrawColumnCell事件中设定要改变颜色的行的条件,并指定DBGrid的Canvas.Brush.color属性并且把Canvas.pen.mode属性设成pmmask,再调用DBGrid的DefaultDrawColumnCell方法即可。注意在改变这两个属性前要先保护好原来的Canvas.Brush.color属性的值,调节器用完成 DefaultDrawColumnCell方法后要把原属性值改回,现以Delphi\demos\db\clientmd 目录下的演示程序clintproj.dpr 为例子,做简单说明,下面是对程序中的栅格MemberGrid的合条件的整行进行变色,变成黑体背景黄色的,其它不合条件的行的颜色为正常字体,白色背景,只在DrawColumnCelL 事件中设条件其它的不变,如下: procedure TClientForm.MemberGridDrawColumnCell(
    Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn;
     State: TGridDrawState);
        var 
            oldcolor:tcolor;
            oldpm:tpenmode;begin
      if DM.ProjectTEAM_LEADER.Value = 
    DM.Emp_ProjEMP_NO.Value then  {设定变色的行的条件}
         MemberGrid.Canvas.Font.Style := [fsBold];
         MemberGrid.DefaultDrawColumnCell
    (Rect, DataCol, Column, State);
         {上面是演示程序的原内容,以下是增加部分}
      if DM.ProjectTEAM_LEADER.Value = 
    DM.Emp_ProjEMP_NO.Value then {设定变色的行的条件}
        begin
           oldpm:= MemberGrid.Canvas.pen.mode;
           oldcolor:= MemberGrid.Canvas.Brush.color;
           MemberGrid.Canvas.Brush.color:=clyellow;
           MemberGrid.Canvas.pen.mode:=pmmask;
           MemberGrid.DefaultDrawColumnCell
    (Rect, DataCol, Column, State);
           MemberGrid.Canvas.Brush.color:=oldcolor;
           MemberGrid.Canvas.pen.mode:=oldpm;
        end;
     
    end;
      

  2.   

    只对一个格子变色:
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      if (Column.Field.FieldName = 'NAME') and (Column.Field.AsString = 'aaa') then
        DBGrid1.Canvas.Font.Color := clRed;
      DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;//