如何修改DBGRID中某一行显示的背景颜色(急)(100分)

  • 主题发起人 主题发起人 lliu
  • 开始时间 开始时间
L

lliu

Unregistered / Unconfirmed
GUEST, unregistred user!
我用DBGRID控件显示一个表中的数据,但对某些满足一定条件的行或列,希望能用不同的颜色区分。请教各位大侠,该怎么办?谢谢!
 
在Delphi中随意控制DBGrid 每一行的颜色
中国地质大学研究生院
张兵兵 黄孝林
---- 有个问题是在Delphi中使用DBGrid时,如何让DBGrid中每一行颜色按照用户
自己的意愿控制。最初看到这个问题时,我们以为非常非常简单,所以马上动手准
备解决它。结果却发现不是那么回事,传统方法根本不能发挥作用。在电脑面前一
直坐到凌晨4点,不断地调试,幸运地是凭借平时积累的一点编程经验,终于找到了
开门的匙钥。现将它充公,供大家享用。

---- 1、 数据表的建立

---- 在Delphi的工具菜单中选择Database desktop,在数据库DBDemos下建立一
个名为example.db的数据表。数据表的字段和内容如下:


Name Age Wage
张山 25 500
王武 57 1060
李市 30 520
刘牛 28 390
 

---- 2、创建基于TDBGrid的TColoredDBGrid组件

---- 在Delphi组件菜单中,选择New Component,在弹出对话框中作以下设置:

Ancestor Type = TDBGrid
Class Name = TColoredDBGrid
 

---- 然后单击OK按钮,Delphi自动完成组件基本框架的定义。增添
OnDRawColoredDBGrid事件并使它出现在Object Inspector的Events中以便在应
用程序中设定改变行颜色的条件。重载DrawCell方法,只能自己绘制单元格。不能
通过在OnDrawColumnCell来设置颜色,因为在OnDrawColumnCell改变单元格的颜
色会再次触发OnDrawColumnCell。

---- 下面就是所创建组件的源程序 。

---- 3、建立应用程序进行验证。

---- 在Delphi文件菜单中选择New建立新的应用程序工程Project1和主窗体
Form1,设置Form1的Caption属性为“控制DBGrid行颜色的示例”。在主窗体
上添加Data Source、Table、Button和ColoredDBGrid组件。设置各组件的
属性如下:

Table1.Database=’DBDemos’
Table1.Tablename=’example.db’
Datasource1.Dataset=Table1
ColoredDBGrid1.Datasource=DataSource1
Button1.Caption=’退出’
 

---- 在ColoredDBGrid1的onDRawColoredDBGrid事件中输入下列代码,设定
由Wage(工资)来决定在ColoredDBGrid1各行的颜色。

procedure TForm1.ColoredDBGrid1 DRawColoredDBGrid
(Sender: TObject; Field: TField; var Color:
TColor; var Font: TFont);
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;
//用‘退出’按钮结束程序运行。
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
 

---- 4、程序运行结果

---- 本程序在win98(中文版)和delphi4.0(C/S版)中测试运行,得到预计
的结果:第一行和第三行变为红色,第二行变为棕色,第四行为绿色,满足了基本要求。

 
看看delphi4变成技术内幕吧
那里介绍的很详细!!!!
 
>>wjiachun
能否给出创建控件TColoredDBGrid的源代码?谢谢
 
如果仅仅需要改变字的颜色,只要在DBgrid的
ondrawcolumncell事件中写上
begin
if 条件1 then
dbgrid1.canvas.Font.Color:=clred
else if 条件2 then
dbgrid1.canvas.Font.Color:=clblue
end;就行了.
 
看这里:
在DBGrid的OnDrawDataCell事件里可以改变单元格的颜色
某一列的颜色可直接改

procedure TForm1.Button1Click(Sender: TObject);
begin
query1.close;
query1.sql.text:='select * from animals';
query1.open;
end;

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
DBGrid1.Canvas.Font.Color:=clred;
DBGrid1.Canvas.Brush.Color:=clgray;

{//改变某个单元格的颜色
if (Field.FullName='SIZE')and (Field.AsInteger=2) then
begin
DBGrid1.Canvas.TextRect(rect,rect.Left,rect.Top,Field.AsString);
end;}

//改变某行的颜色,该行的NAME字段值=aaa
if Field.DataSet.FieldByName('NAME').asString='aaa' then
DBGrid1.Canvas.TextRect(Rect,rect.Left,rect.Top,Field.AsString);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//改变某个列的颜色
DBGrid1.Columns[1].Color:=clgreen;
DBGrid1.Columns[1].Font.color:=clred;
end;


good luck!
 
用InforPower控件很容易实现,想要吗?
 
>>to DSM2000
我想要。给我一个好吗?我的E-MAIL:YWLLIU@263.net.谢谢!
 
我可能没有说清楚,我时希望在程序运行过程中根据对某行选择的不同事件显示不同的颜色。欢迎赐教。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
909
DelphiTeacher的专栏
D
D
回复
0
查看
704
DelphiTeacher的专栏
D
D
回复
0
查看
666
DelphiTeacher的专栏
D
后退
顶部