随意控制DBGrid 每一行的颜色: Var p : Integer; begin p := Table1.FindField('wage').AsInteger; //取得当前记录的Wage字段的值。 if(p < 500) then begin //程序将根据wage值设置各行的颜色。 Color := clGreen; Font.Style := [fsItalic]; //不仅可以改变颜色,还可以改变字体 end; if (p >= 500) And (p < 800) then Color := clRed; if(p >=800) then begin Color := clMaroon; Font.Style := [fsBold]; end; end;
我在ado中测试成功了,但是bde的我还没有想出解决的方法。 把adoquery1的locktype设为ltBatchOptimistic ,然后 procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (DBGrid1.DataSource.DataSet As TCustomADODataSet).RecordStatus = [rsModified] then DBGrid1.Canvas.Brush.Color:=CLRed; DBGrid1.DefaultDrawColumnCell(Rect,datacol,column,state); end; 但是不要忘了,最后提交是要调用adoquery1.UpdateBatch()
在DBGrid的OnDrawColumnCell事件中调用 procedure DBGridColumnColor(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState; singlecolor:TColor;doublecolor:TColor;selectedcolor:TColor); var dataset:tdataset; dbgrid:tdbgrid; begin dataset:=TDBGrid(Sender).DataSource.DataSet; dbgrid:=TDBGrid(Sender); if (dataset.Recno mod 2) <> 0 then //隔行 begin dbgrid.Canvas.Font.Color := clWhite; dbgrid.Canvas.Brush.Color := singlecolor; //这里设置单元格填充色 dbgrid.Canvas.FillRect(Rect); //这里对相应的单元格进行背景色填充 end else begin dbgrid.Canvas.Font.Color := clWhite; dbgrid.Canvas.Brush.Color :=doublecolor; dbgrid.Canvas.FillRect(Rect); end; //输出内容 dbgrid.Canvas.TextRect( Rect, Rect.Left, Rect.Top, Column.Field.DisplayText); if gdSelected in State then //被选中行的颜色 begin dbgrid.Canvas.Brush.Color :=selectedcolor; dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end;procedure DBGridrowColor(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState;singlecolor:TColor; doublecolor:TColor;selectedcolor:TColor); var dbgrid:tdbgrid; begin dbgrid:=TDBGrid(Sender); if Odd(Column.Index) then //隔列 begin dbgrid.Canvas.Font.Color := clWhite; dbgrid.Canvas.Brush.Color :=singlecolor; //这里设置单元格填充色 dbgrid.Canvas.FillRect(Rect); //这里对相应的单元格进行背景色填充 end else begin dbgrid.Canvas.Font.Color := clWhite; dbgrid.Canvas.Brush.Color :=doublecolor; //这里设置单元格填充色 dbgrid.Canvas.FillRect(Rect); end; dbgrid.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Column.Field.DisplayText); if gdSelected in State then //被选中行的颜色 begin dbgrid.Canvas.Brush.Color :=selectedcolor; dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State); end; end;
BDE的测试也通过了。 把TABLE1的CACHEDUPDATES 设定为true 然后: procedure TForm1.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if (table1.UpdateStatus = usModified) then DBgrid2.Canvas.Brush.Color :=clREd; DBGrid2.DefaultDrawColumnCell(REct,datacol,column,state); end;procedure TForm1.Button2Click(Sender: TObject); begin table1.CommitUpdates; end;
dbgrid1.canvas.font.color := clBlue;
dbgrid1.defaultdrawcolumncell(rect,datacol.column,state);
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
dbgrid1.Canvas.Pen.Mode := pmmask;
If aqBaseQuery.fieldbyname('a')='2' Then
Canvas.brush.Color := ClWhite
else
Canvas.brush.Color := $00EAEAEA;
end;
dbgrid1 .DefaultDrawColumnCell(Rect, DataCol, Column, State);
End;
aqBaseQuery.fieldbyname('a')='2' ,指定条件才变颜色,我只要修改了哪 一行,哪 一行颜色就跟着改变,这样可以吗?
Var
p : Integer;
begin
p := Table1.FindField('wage').AsInteger;
//取得当前记录的Wage字段的值。
if(p < 500) then begin
//程序将根据wage值设置各行的颜色。
Color := clGreen;
Font.Style := [fsItalic];
//不仅可以改变颜色,还可以改变字体
end;
if (p >= 500) And (p < 800) then
Color := clRed;
if(p >=800) then begin
Color := clMaroon;
Font.Style := [fsBold];
end;
end;
把adoquery1的locktype设为ltBatchOptimistic ,然后
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (DBGrid1.DataSource.DataSet As TCustomADODataSet).RecordStatus = [rsModified] then
DBGrid1.Canvas.Brush.Color:=CLRed;
DBGrid1.DefaultDrawColumnCell(Rect,datacol,column,state);
end;
但是不要忘了,最后提交是要调用adoquery1.UpdateBatch()
procedure DBGridColumnColor(Sender: TObject;const Rect: TRect;
DataCol: Integer; Column: TColumn;State: TGridDrawState;
singlecolor:TColor;doublecolor:TColor;selectedcolor:TColor);
var
dataset:tdataset;
dbgrid:tdbgrid;
begin
dataset:=TDBGrid(Sender).DataSource.DataSet;
dbgrid:=TDBGrid(Sender);
if (dataset.Recno mod 2) <> 0 then //隔行
begin
dbgrid.Canvas.Font.Color := clWhite;
dbgrid.Canvas.Brush.Color := singlecolor; //这里设置单元格填充色
dbgrid.Canvas.FillRect(Rect); //这里对相应的单元格进行背景色填充
end
else
begin
dbgrid.Canvas.Font.Color := clWhite;
dbgrid.Canvas.Brush.Color :=doublecolor;
dbgrid.Canvas.FillRect(Rect);
end; //输出内容
dbgrid.Canvas.TextRect( Rect, Rect.Left, Rect.Top, Column.Field.DisplayText);
if gdSelected in State then //被选中行的颜色
begin
dbgrid.Canvas.Brush.Color :=selectedcolor;
dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;procedure DBGridrowColor(Sender: TObject;const Rect: TRect; DataCol: Integer;
Column: TColumn;State: TGridDrawState;singlecolor:TColor;
doublecolor:TColor;selectedcolor:TColor);
var
dbgrid:tdbgrid;
begin
dbgrid:=TDBGrid(Sender);
if Odd(Column.Index) then //隔列
begin
dbgrid.Canvas.Font.Color := clWhite;
dbgrid.Canvas.Brush.Color :=singlecolor; //这里设置单元格填充色
dbgrid.Canvas.FillRect(Rect); //这里对相应的单元格进行背景色填充
end
else
begin
dbgrid.Canvas.Font.Color := clWhite;
dbgrid.Canvas.Brush.Color :=doublecolor; //这里设置单元格填充色
dbgrid.Canvas.FillRect(Rect);
end;
dbgrid.Canvas.TextRect(Rect, Rect.Left, Rect.Top, Column.Field.DisplayText); if gdSelected in State then //被选中行的颜色
begin
dbgrid.Canvas.Brush.Color :=selectedcolor;
dbgrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
把TABLE1的CACHEDUPDATES 设定为true
然后:
procedure TForm1.DBGrid2DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (table1.UpdateStatus = usModified) then
DBgrid2.Canvas.Brush.Color :=clREd;
DBGrid2.DefaultDrawColumnCell(REct,datacol,column,state);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
table1.CommitUpdates;
end;