怎么实现dbgrid动态绘色功能,各位大侠请拍砖扔玉

如何实现dbgrid动态绘色功能,各位大侠请拍砖扔玉
dbgrid打开行选选项,然后我想实现的功能是:当三角标记停留在某一行记录,按下回车,这一行变成红色,移开三角标记这一行还是红色,这该如何实现呢?我刚学delphi,请大家指导一下,谢谢。

------解决方案--------------------
1、在数据库中做个标记,然后根据此此字段值去绘制颜色。
2、在DBGridr的DrawColumnCell事件中,加入以下代码 
var s:string;
begin
with TMyCustomDBGrid(Sender) do
begin
s:=DataLink.Fields[3].AsString;
if S=''
then begin
DBGrid1.Canvas.Font.Color:=clBlack;
DBGrid1.Canvas.pen.mode:=pmmask;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end
else begin
DBGrid1.Canvas.Font.Color:=clblue;
DBGrid1.Canvas.pen.mode:=pmmask;
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
end;

------解决方案--------------------
先定位,再著色。。。

Delphi(Pascal) code
procedurDrawLine(tab:Ttable;const Rect:Trect;Field:Tfield;state:TgridDrawState;dbg:TDBGrid)
begin
if (tab.fieldbyname(zdm).asstring=zdz)then
begin
dbg.canvas.font.color:=clred;
dbg.canvas.brush.color:=clyellow;
end;
dbg.DefaultDrawDataCell(Rect,Field,State);
end;

------解决方案--------------------
procedure TfrmMain.grdDBSDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
hb: TBrush;
p: TPen;
begin
if gdSelected in State then Exit;
//斑马线效果
if TDBGrid(Sender).DataSource.DataSet.RecNo mod 2 = 0 then
TDBGrid(Sender).Canvas.Brush.Color := clInfoBk
else
TDBGrid(Sender).Canvas.Brush.Color := RGB(191, 255, 223);
//指定行着色
if TDBGrid(Sender) = grdDBS then
begin
if qryDBSDBS_BH.AsString = qryDBSDBS_GS.AsString then
begin
grdDBS.Canvas.Brush.Color := clYellow;
grdDBS.Canvas.Font.Style := grdDBS.Canvas.Font.Style + [fsBold];
end;
end

TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
------解决方案--------------------
参考
Delphi(Pascal) code
dbgrid用两种颜色间隔分行显示 收藏 
Delphi代码如下:

 procedure   TForm1.DBGrid1DrawColumnCell(Sender:   TObject;   const   Rect:   TRect;   
      DataCol:   Integer;   Column:   TColumn;   State:   TGridDrawState);   
  begin   
      with   (Sender   as   TDBGrid)   do   
      begin   
          if   ((State   =   [gdSelected])   or   (State   =   [gdSelected,   gdFocused]))   then   
          begin   
              Canvas.Font.Color   :=   clHighlightText;   
              Canvas.Brush.Color   :=   clHighlight;   
          end   
          else   
          begin   
              if   DataSource.DataSet.RecNo   mod   2   <>   0   then   
                  Canvas.brush.Color   :=   clRed   
              else   
                  Canvas.brush.Color   :=   clYellow;   
          end;   
          DefaultDrawColumnCell(Rect,   DataCol,   Column,   State);   //这行是关键   
      end;   
  end;

简单的方法

  procedure   TForm1.DBGrid1DrawColumnCell(Sender:   TObject;   const   Rect:   TRect;   
      DataCol:   Integer;   Column:   TColumn;   State:   TGridDrawState);   
  begin   
      if   (Table1.RecNo   mod   2)=0   then   
          Dbgrid1.Canvas.Brush.Color:=clred;   
      else   
          Dbgrid1.Canvas.Brush.Color:=clblue;   
      Dbgrid1.DefaultDrawColumnCell(Rect,   DataCol,   Column,   State);   
  end;

改为c++builder 代码就是

void __fastcall TMainFrm::Veh_DBGridDrawColumnCell(TObject *Sender, const TRect &Rect,
    int DataCol, TColumn *Column, TGridDrawState State)
{

  try
  {
  if(Veh_DBGrid->DataSource->DataSet->RecNo%2==0)
  {
   Veh_DBGrid->Canvas->Brush->Color=clSilver;
  }
  else
  {
   Veh_DBGrid->Canvas->Brush->Color=clWindow;
     }
  Veh_DBGrid->DefaultDrawColumnCell(Rect,DataCol,Column,State) ;

  }
  catch(...)
  {
   //
  }
}