我将一个dbGrid填充为设置为RowSelect的MyDAC-SQL-Query。 一列包含位置字符串,每个位置可以有多行。
我想做的是提供视觉反馈,以便更好地区分不同的位置。所以第一个位置的行应该是白色背景,第二个是灰色的,第三个是白色,依此类推...
我知道如何为每一行提供不同的背景,但是我想要检测位置发生变化的行。
因此,在DrawColumnCell
过程中,我想查看前一行的位置值以检测更改。我怎样才能做到这一点?
答案 0 :(得分:2)
您必须实现一些逻辑来存储前一个字段的值,并确定是否需要新颜色。
以下是这样做的一个简单示例。要进行设置,只需要几个步骤 - 为了简单起见,我已经开始使用新的空白VCL表单应用程序。
在表单private
部分添加三个新变量:
private
SameCity, SameColor: Boolean;
LastCity: string;
将以下代码添加到表单的OnCreate
事件中以设置数据并初始化变量:
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
// One field dataset, with the exact same cities and rows
// you've shown in your question
CDS.FieldDefs.Add('City', ftString, 10);
CDS.CreateDataSet;
for I := 1 to 3 do
CDS.AppendRecord(['London']);
for i := 1 to 2 do
CDS.AppendRecord(['Paris']);
CDS.AppendRecord(['Berlin']);
for i := 1 to 2 do
CDS.AppendRecord(['New York']);
CDS.Open;
// Initialize variables for first use
LastCity := '';
SameColor := False;
SameCity := False;
end;
使用以下代码向OnDrawDataCell
事件的DBGrid添加事件处理程序:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
const
RowColors: array[Boolean] of TColor = (clWindow, clLtGray);
begin
// See if we're on the same city as the last row, and save the
// value in the current row for use next row.
SameCity := (Field.AsString = LastCity);
LastCity := Field.AsString;
// If they weren't the same, toggle the color value
if not SameCity then
SameColor := not SameColor;
// Set the row color and tell the grid to draw the row
(Sender as TDBGrid).Canvas.Brush.Color := RowColors[SameColor];
(Sender as TDBGrid).DefaultDrawDataCell(Rect, Field, State);
end;
我使用了 OnDrawDataCell 而不是 OnDrawColumnCell ,因为它没有在标题行或固定列上调用,因此DBGrid会照顾完全吸引那些。
运行应用程序会产生这些结果。