怎么实现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;
------解决方案--------------------
先定位,再著色。。。
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(...) { // } }