dbgrid选择行的背景颜色设置?(50分)

  • 主题发起人 主题发起人 zhangdamin
  • 开始时间 开始时间
Z

zhangdamin

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGRID的选项设置为:
[dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs
,dgRowSelect,dgAlwaysShowSelection,dgConfirmDelete,dgCancelOnExit
,dgMultiSelect],
当前记录行的背景颜色总是兰色,请问如何改变?

 
这有用吗?

使dbgrid的某几笔资料变色,像标记一样??


你可在 DBGrid 元件的 DrawDataCell 事件中, 依资料的条件性来改变格子或文字的
颜色.

如 :

OnDrawDataCell(...)
begin
with TDBGrid(Sender) do
begin
if (条件) then
Canvas.TextOut(Rect.Left + 4, Rect.Top + 2, '要显示的文字, 如表格的资料');
end;

而你会看到 DBGrid 的 显示资料怎麽有重叠的情况, 那是因为原本DBGrid
要显示的资料与 TextOut 所显示的资料重叠, 解决方法 :

在 Query 元件所加入的栏位(在元件上按右键, 会有 Add Fields...的选单), 在
不要显示资料的栏位的 OnGetText 事件中有一参数设定为 False;

procedure TForm1.Query1Detail1GetText(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
// 决定在 DBGrid 得知表格资料时, 要不要显示所得到的资料, False -> 不显示
// 就可避免与 TextOut 的文字重叠了
DisplayText : = False;
end;

end;



如果用 Delphi 3 处理很简单.

例如,对表中某字段当其数值小于0时为红字,其他为黑字.
在 DBGrid.OnDrawColumnCell(...) 中:
begin
if TableField.AsInteger < 0 then
DBGrid.Canvas.Font.Color := clRed
else
DBGrid.Canvas.Font.Color := clBlack;

DBGrid.DefaultDrawColumnCell(...);
end;

这样,对 Field 指定的格式仍旧生效,不必重写.

 
不行再来这个。

实用技巧
在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版)中测试运行,得到预计的结果:第一行和第三行变为红色,第二行变为棕色,第四行为绿色,满足了基本要求。
 
请看清题目!
我要的是改变选择行(即当前记录所指向的行),在一个DBGIRD中此行永远只有一行,此行随着当前记录的改变,而不断改变。
请注意DBGRID的选项:dgRowSelect。
 
好!我知道了
谢谢
 
本人发现:此颜色是WINDOWS选定的项目的颜色,如何改变之?
 
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if Table1.FieldByName('Salary').AsInteger > 30000 then begin
//字体
DBGrid1.Canvas.Font.Color := clRed;//字体色
//背景
DBGrid1.Canvas.Brush.Color := clBlue;//背景色
DBGrid1.Canvas.FillRect(Rect);
end;
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;

OK!
 
我这有资料,不知行不行可以的话,请给我几分
 

在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版)中测试运行,得到预计的结果:第一行和第三行变为红色,第二行变为棕色,第四行为绿色,满足了基本要求。
 
多人接受答案了。
 
后退
顶部