Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从DrawColumnCell中的前一行获取值_Delphi_Dbgrid - Fatal编程技术网

Delphi 从DrawColumnCell中的前一行获取值

Delphi 从DrawColumnCell中的前一行获取值,delphi,dbgrid,Delphi,Dbgrid,我将MyDAC SQL查询设置为RowSelect,以填充dbGrid。 一列包含位置字符串,每个位置可以有多行 我想做的是提供视觉反馈,以便更好地区分不同的位置。因此,第一个位置的行应具有白色背景,第二个位置的行应具有灰色背景,第三个位置的行应具有白色背景,依此类推 我知道如何为每一行提供不同的背景,但我正在努力检测位置在哪一行发生变化 因此,在DrawColumnCell过程中,我想查看前一行的位置值以检测更改。如何实现这一点?您必须实现一些逻辑来存储前一个字段的值,并确定是否需要新颜色

我将MyDAC SQL查询设置为RowSelect,以填充dbGrid。 一列包含位置字符串,每个位置可以有多行

我想做的是提供视觉反馈,以便更好地区分不同的位置。因此,第一个位置的行应具有白色背景,第二个位置的行应具有灰色背景,第三个位置的行应具有白色背景,依此类推

我知道如何为每一行提供不同的背景,但我正在努力检测位置在哪一行发生变化


因此,在
DrawColumnCell
过程中,我想查看前一行的位置值以检测更改。如何实现这一点?

您必须实现一些逻辑来存储前一个字段的值,并确定是否需要新颜色

下面是一个这样做的快速示例。要设置它,只需要几个步骤——为了简单起见,我从一个新的空白VCL表单应用程序开始

  • 将TClientDataSet放到表单上,并将其名称更改为CD
  • 添加TDataSource,并将其数据集设置为CD
  • 接下来,添加一个TDBGrid并将其数据源设置为DataSource1
  • 将DBGrid.DefaultDrawing更改为False
  • 将三个新变量添加到表单的
    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将负责完全绘制这些内容

运行应用程序会产生这些结果


谢谢你的帮助。不幸的是,我在调用
CDS.CreateDataSet时遇到访问冲突DrawDataCell
没有被调用…1)您必须在设计时将ClientDataSet放到表单上。2) 必须将DBGrid.DefaultDrawing设置为False。在发布之前,我编译并运行了代码(这就是我获取屏幕截图的方式),因此如果您正确地遵循说明,它就会工作。好吧,我做到了所有这些。也许我们的delphi版本有些不同?我也在使用Xe5(很抱歉,如果我问的是显而易见的问题),您确实使用了Object Inspector Events选项卡来生成两个事件处理程序,并在使用代码之前将它们连接起来?如果您正在部署应用程序并且不想随应用程序分发Midas,则只需将MidasLib添加到uses子句中。对于选定的行,这是一个不同的主题。我已经回答了你在这里提出的问题。选择单元格时,您必须以不同的方式绘制它-这就是您在收到的
状态
参数中得到的结果。当选择
State=dg时,按您喜欢的方式绘制它