注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
杀毒全接触:关于mcafee的进程了
关于木马隐藏一个的新方法
穿梭于防火墙下的黑马 DBB后门程
关于域名dns的常见问题
关于sendmail.cf的简单解释
关于服务器升级的几点看法
关于为远程用户设置 internal“或
ORACLE应用经验(3)-DBMS_SQL封装
常见数据库系统之比较 - DB2数据
DB2常用傻瓜问题1000问(之一)
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> Delphi >> 文章正文
关于DBGrid的分类颜色显示
作者:XuDunYu  来源:csdn  点击:  更新:2006-12-19
简介:
 这两天在csdn里转转,发现很多人问关于DBGRID或DBGRIDEH的分类显示的问题,今天闲下来,就这个问题聊两句。实际上对于DBGRID的自画,delphi 提供了两个事件供我们使用,
一个是画行的:
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.






  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务