Delphi Grid DrawColumnCell无法清除

时间:2017-07-24 03:46:27

标签: delphi datagrid draw

我正在按照示例在delphi列单元格中放置一个复选框。我可以在单元格中放置一个复选框图像。但是底层的布尔值比图像长,因此复选标记位于" True"的前两个字母上。或"错误"。如何清除列单元格中的矩形?我试着打印原版" True"或"错误"没有颜色,或白色的白色,但无论我做出什么选择,文字总是黑色的。 我的代码示例:

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;

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

您已经更正了mageList1.Draw()方法的代码,并添加了网格引用(TreatGrid)。为bg绘画做同样的事。

您似乎尝试以不同的方式调用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