这两天在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.
没有相关教程
|