按字段着色

 

    CANVAS 是一种功能极强的特殊属性。在DELPHI 中只有少数的控件具有此属性,而DBGrid即是其中的一个。所谓画布,就是把某些控件的表面作为一张画板,允许操作者在其表面进行作图、显示图像或显示字符等操作。这种控制机制完全可以改善某些控件本身的表现形式,使其具有丰富的外观形象。在CANVAS 属性的使用过程中,经常需要与对象Rect 配合。Rect 对象是定义出的一块矩形区域,可灵活地对此区域进行各种绘图操作。DBGdir 对CANVAS 提供了最大限度的支持,网络中每一个单独的表格,包括每条记录的各个数据项,均被事先定义为一个Rect 对象,这更增加了CANVAS 操作的灵活性。只要按字段的名称调整每个记录中数据项表格的Rect 对象颜色,即可获得DBGrid按字段分颜色显示的效果。具体操作时需要注意以下几个问题:
  1、用一种颜色填充表格的Rect 之后,该表格项中的内容会被画布完全覆盖,此时必须利用画布的字符串显示功能重显该表格内容,才不会影响正常的表格内容,命令为:canvas .textout :=cells(X,Y)。
  2、当窗口重画时,比如最小化之后恢复,或者鼠标单击表格等动作,都会改变用CANVAS 的着色效果,为了保证着色效果的永久完整,必须对其进行重新着色,具体操作时可把着色代码安排在DrawDataCell()事件中,因为此事件在需要时可自动重画DBGrid 表面。
  编程涉及的网格属性及画布命令:
canvas .brush :定义填充颜色
canvas .fillrect(TRect):对Rect 对象进行颜色
填充canvas .textout(X,Y ,String):在CANVAS 上显
示字符串比如当前目录下存在一个Demo .dbf 数据库文
件,共有三个字段,分别为XM、XB、NY ,下面
的代码可分别用三种颜色把此数据库内容填充到
DBGrid 之中:
(1)创建一个新的项目,在其上面分别安排下面三个控件:Tablel、Da—
ta—Sourcel、DBGrid1;
(2)使TABLE1
的Tablename 属性指
向Demo .dbf 文件,之
后置TABLE1的Active 属性为真,以打开此数据库;
(3)将DataSourcel 的DataSet 属性置为Tablel ,
建立与DEMO.DBF 数据库的链接。
(4)将DBGrid1r 的DataSource 属性置为Data—
Sourcel ,此时DBGrid 网络中将列出该数据库内容;
(5)在DBGrid1DrawDataCell()事件中安装如下
代码,实现按字段着色效果:
procedure TForm1.DB—Grid1DataCell(Sender :TOb—
ject ;const Rect :TRect ;
Field :TField ;State :TGridDraw—State);
var ch :string ;
begin
ch :=Field .fieldname ;
if ch ='XM'then DBgrid1.canvas .brush .color :=$000000ff else
if ch ='XB'then DBgrid1.canvas .brush .color :=$0000800else
if ch ='NY'then DBgrid1.canvas .brush .color :=$00ff0000else
DBgrid1.canvas .brush .color :=$0020508f ;
DGgridl .canvas .fillRect(Rect);
DBgridl .canvas .textout(Rect .left +4,Rect .top +
4,field .Asstring);
end ;
(6)运行此程序,就会在窗口中显示出漂亮的
彩色网格;
由此方法可以延伸出DBGrid 或其它网格控件的多种修饰方法,比如可以按数据项值采用不同的颜色,可以按记录号显示不同的颜色,甚至可以在网格中的单位表格项中显示出图像等等。总之,灵活应用CANVAS、RECT 及BITMAP 等对象,可以将各种网格装饰得绚丽多彩。
  (河北吴泽平)