DBGrid的分类颜色显示
来源:互联网 发布:神奇百货 骗局 知乎 编辑:程序博客网 时间:2024/04/29 22:49
一个是画行的:
OnDrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
另一个是画列的:
OnDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
这就给我们很大的方便。对于DBGRID的分类颜色显示,明显应该用第一个事件。那么怎么才能分类按颜色显示呢,实际上听起来很难,但实际上很简单。
首先定义一个类型为TColor的变长数组,然后在数据集的AfterOpen事件中,将数组的长度定义为数据集的记录个数。然后根据你的分类计算出数组的每一个元素的颜色值,数组的每一个元素应该和数据集的一条记录相对应。最后,在你的OnDrawColumnCell事件中写下如下代码。
DBGRID1.Canvas.Brush.Color := C[Low(c)+DBgrid1.DataSource.Dataset.RecNo()-1];
上面是设置行的背景色,如果你要设置字体色只需要用
DBGRID1.Canvas.Font.Color := C[Low(c)+DBgrid1.DataSource.Dataset.RecNo()-1];
最后不要忘记了还要加上一句
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
如此就可以随心所欲的显示你所喜欢的颜色。以上只是我的一点愚见,有心人会说了,你这样做效率很低的
你需要将数据库全都遍历一遍。是的,你要想显示,肯定要遍历数据库,只不过对于大型数据库来说,你可以不一定在数据库的AfterOpen后做,你也可一一次只遍历数据库的一部分,比如说你在别的事件比如说ClientDataset的AfterGetRecords中作。另外最好的方法是在服务器端用一个存储过程计算此数组的值,这样是最有效率的方法。当然这些都是原理,这里不做详细讨论。下面是一个简单的DEMO将DBgrid的数据每10个
一组显示红绿两色,在Delphi7.0下边以通过。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
Query1: TQuery;
DBGrid1: TDBGrid;
procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
procedure Query1AfterOpen(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
clf:array of Tcolor;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Query1.Active := False;
Query1.DatabaseName := 'DBDEMOS';
Query1.SQL.Add('select * from orders');
DataSource1.DataSet := Query1;
Dbgrid1.DataSource := DataSource1;
Dbgrid1.Align := alClient;
Query1.Active := True;
end;
procedure TForm1.Query1AfterOpen(DataSet: TDataSet);
var
i,aa:integer;
c:Tcolor;
begin
query1.DisableControls;
setlength(clf,query1.RecordCount);
query1.First;
i := Low(clf);
clf[i] := clRed;
c := clRed;
aa:=1;
while not query1.Eof do
begin
if (query1.RecNo - aa)>9 then
begin
aa := aa + 10;
if c = clRed then c:= clGreen
else c := clRed;
end;
clf[i] := c;
Inc(i);
query1.Next;
end;
query1.First;
query1.EnableControls;
end;
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
DBGrid1.Canvas.Brush.Color := clf[Dbgrid1.DataSource.DataSet.RecNo-1+Low(clf)];
DBGrid1.DefaultDrawDataCell(Rect, Field, State);
end;
end.
- DBGrid的分类颜色显示
- 关于DBGrid的分类颜色显示
- 根据条件,DBGrid不同行显示不同的颜色
- 控制 dbgrid 的显示
- 动态更新DBGrid的颜色
- dbgrid用两种颜色间隔分行显示
- Delphi DBGrid显示颜色应用技巧
- dbgrid 根据某一列的值,改变颜色及该列的显示值
- dbgrid根据值改变行的颜色
- DBGrid 改变行的颜色 ListItem 改变行的颜色
- DBGrid显示行号的几种方法
- 遍历邮件分类,并显示分类颜色
- Dbgrid 当前行颜色
- DBGrid表格颜色定义
- 设置DBGrid单元格颜色
- DBGrid间隔行颜色
- DBGrid间隔行颜色
- DBGrid中分行分列、单元格的颜色设置
- ubuntu技巧
- aspx 操作mysql
- Registrare le password al Login di Windows
- 给Listview加上进度条
- oracle通过透明网关(Oracle Transparent Geteways),访问ms sql server和其他数据库
- DBGrid的分类颜色显示
- 使TStringGrid自适应宽度
- 事关CUBE ROLLUP GROUPING SETS(1)
- 在dll中delphi中封装窗体
- 圆
- 将dll从进程模块列表中移除并保持正常运行
- ACM练习时为什么要写int main()后面还要跟个return 0;的疑问。
- 虚拟化概述——研读历程
- 用Delphi编写一个Svchost.exe调用的DLL模块