Delphi Grid DrawColumnCell无法清除

标签 delphi datagrid draw

我正在按照示例在 delphi 列单元格中放置一个复选框。我可以在单元格中放置一个复选框图像。但底层 bool 值比图像长,因此复选标记位于“True”或“False”的前两个字母上方。如何清除列单元格中的矩形?我尝试以无颜色或白色打印原始的“True”或“False”,但无论我做出什么选择,文本始终是黑色。 我的代码示例:

procedure TFUpdtLists.TreatGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State:  
TGridDrawState);
begin
  with Column do begin
    //  TreatGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);  ???
    if FieldName = 'Repro' then begin
      Canvas.Brush.Color:= TreatGrid.Color;
      Canvas.FillRect(Rect);//fails to clear cell, clears another area??
      if Field.Value = True then
        //#7 a checkmark and # 5 a blank image in the image list:
        MainView.ImageList1.Draw(TreatGrid.Canvas,Rect.Left,Rect.Top,7)
      else  
        MainView.ImageList1.Draw(TreatGrid.Canvas,Rect.Left,Rect.Top,5);
      TreatGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);//??
    end;
  end;
end;

提前致谢!

最佳答案

绘制背景时请注意代码中引用的Canvas。由于没有名为 Canvas 的参数,并且 Column 也没有 Canvas,因此它引用了 Canvas执行代码的 TFUpdtLists

您已经更正了 mageList1.Draw() 方法的代码并添加了网格引用 (TreatGrid)。对背景画做同样的事情。

看来您已尝试以不同的方式调用 DefaultDrawColumnCell(),但您应该仅针对您自己不绘制的列调用它。

我还建议您停止使用 with ...,因为它会阻止代码完成工作,并使调试变得更加困难,并显着增加编码错误的风险。

经过上述更改,OnDrawColumnCell() 过程如下所示;

procedure TForm19.TreatGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'Repro' then
  begin
    TreatGrid.Canvas.Brush.Color:= TreatGrid.Color;
    TreatGrid.Canvas.FillRect(Rect);
    if Column.Field.Value then
    //#7 a checkmark and # 5 a blank image in the image list:
      Form19.ImageList1.Draw(TreatGrid.Canvas,Rect.Left,Rect.Top,1)
    else
      Form19.ImageList1.Draw(TreatGrid.Canvas,Rect.Left,Rect.Top,0);
  end
  else
    TreatGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

您需要更正图像索引,我在测试中更改了这些索引以适合我的图像列表。

enter image description here

关于Delphi Grid DrawColumnCell无法清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45272321/

相关文章:

android - 无法在谷歌地图上绘制多边形

delphi - 存在任何等效于 swscanf 的 Delphi RTL 函数

mysql - 在 Delphi 中过滤 MySQL 结果

wpf - WPF DataGrid 中的新项目占位符消失

c# - 如何将 WMI 集合显示到 WPF DataGrid

java - 如何在现有 Activity 中画线?

wpf - 如何在WPF中的特定x,y屏幕位置绘制矩形?

java - 将字节数组转换为 float 组

delphi - 如何在Delphi中实现引用计数对象

apache-flex - Flex 数据网格排序不会跨数据提供者更改保留