Delphi Grid DrawColumnCell 无法清除
Delphi Grid DrawColumnCell can not clear
我正在按照示例在 delphi 列单元格中放置一个复选框。我可以在单元格中放置一个复选框图像。但是基础布尔值比图像长,所以复选标记在 "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
,它指的是执行代码的 TFUpdtLists
的 Canvas
。
您已经更正了 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;
您需要更正图像索引,我在测试中更改了这些索引以适合我的图像列表。
我正在按照示例在 delphi 列单元格中放置一个复选框。我可以在单元格中放置一个复选框图像。但是基础布尔值比图像长,所以复选标记在 "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
,它指的是执行代码的 TFUpdtLists
的 Canvas
。
您已经更正了 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;
您需要更正图像索引,我在测试中更改了这些索引以适合我的图像列表。