关于表格控件的OnDrawCell事件

    前段时间写一个程序多次用到了表格控件显示数据。一般我们用表格控件来显示字符串和相关对象能使操作简单化。在窗体中添加一个TStringGrid对象,可完成文本数据的表格化。TStringGrid组件提供了许多可控制网格外观的属性,以及利用表格的结构响应用户操作的事件和方法。TStringGrid具有关联对象与网格中的每个字符串的作用,这些对象为用户封装了字符串表示的信息或行为。

    由于要将指定的格子内容用不同颜色标注,需要在其OnDrawCell事件中重绘表格内容。但OnDrawCell事件的触发机制、执行方式和事件参数具体是什么,组件大全没有说清楚,网上也道不出个所以然。实在没办法,自己拉了两控件做测试,才发现OnDrawCell事件执行是个很有意思的过程。

    以下是组件大全中关于OnDrawCell事件的说明:

    声明:

Type TDrawCellEvent=procedure (Sender:TObject;ACol,ARow:Longint;Rect:TRect;State:TGridDrawState) of object;

 Property OnDrawCell:TDrawCellEvent;

 

    当表格中的单元需要绘制时,触发该事件。Rect指定画布上单元的位置,ACol,ARow指定将要绘制单元的行列索引,State指示指定单元是否有输入焦点,是否被选中以及是否为固定单元。

    首先,在窗体上放一个TStringGrd和一个Memo,如下图所示。

 

    在TStringGrid的OnDrawCell事件中写下如下代码

   procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);  

   begin 

   Memo1.Lines.Add(Format('列: %d,行: %d,矩形:(%d,%d,%d,%d)',  [Acol,Arow,Rect.Left, Rect.Top, Rect.Right, Rect.Bottom])  ); 

   end; 

    点击执行代码,由于窗体控件初始化会触发OnDrawCell事件,看到运行结果如下:

 

    该事件在窗体控件初始化时的执行过程如下图所示:

 

    第一行从左到右每个单元个格触发一次该事件,接着从第二行第一列开始从上到下每个单元格触发该事件一次,然后从第二行第二列开始重复上过程完成初始化重绘。所以整个初始化过程该事件被触发执行的次数等于TStringGrid的行列之积。

    当你用鼠标点击单元格时也会触发该事件两次,如下图所示:

 

   第一次点击单元(2,1)(列,行),触发之前选中单元(1,1)重绘,接着触发当前选中单元(2,1)重绘,第二次点击(3,2)执行同样的过程。

    以上就是表格控件的OnDrawCell事件触发机制与执行过程,有时候我们要重绘指定列时,使用该事件非常容易,如不同行(或列)着不同颜色,根据单元格内容显示不同颜色等等。

    熟悉了该事件的触发机制与执行过程,你就能有针对的优化你的事件处理代码,使程序简单而实用。

原文地址:https://www.cnblogs.com/Little-Star/p/7371526.html