delphi xe7 tclientdataset, dbgrid显示某列的值小于30显示红色,结果是反的?

g58521547 2021-05-04 05:38:18
xe7的clientdatset(cdsrope)+dbgrid,
其中cds里面有一个两个计算字段(duedate, balance) 的都是fkinternalcalc类型。
在cds的oncalc事件中计算这两个字段值,想在dbgrid中根据balance的值,如果小于30就显示红色加粗,否则就正常显示,
看了很久,结果和预想的相反,麻烦高手看看代码哪里有问题,或者设置哪里?

cds的计算事件过程如下:
procedure TfmQuRope.cdsQueryCalcFields(DataSet: TDataSet);
begin
//self.cdsQuery.
// if dataset.State=dsinternalcalc then
begin
dataset.FieldByName('duedate').AsDateTime:=dataset.FieldByName('begindate').AsDateTime +
self.cdsQuery.FieldByName('life').AsInteger;
dataset.FieldByName('balance').AsInteger := trunc(dataset.FieldByName('begindate').AsDateTime
- today)+dataset.FieldByName('life').AsInteger;
end;
end;


dbgrid的drawcolumncell事件如下:
procedure TfmQuRope.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if self.cdsQuery.RecNo mod 2 = 0 then
(Sender as TDBGrid).Canvas.Brush.Color := clskyblue
else
(Sender as TDBGrid).Canvas.Brush.Color := clwindow;
if gdselected in State then
(Sender as TDBGrid).Canvas.Brush.Color := clolive;
// if (sametext(Column.FieldName, 'balance') = true) and
//(self.DBGrid1.Columns[DataCol].Items[1]<30) then
if (datacol=24) and
(Column.Field.AsInteger < fmmain.AdvanceDay) then
//就是这句判断当前列的值是否小于30
begin
//Column.Font.Style := Column.Font.Style + [fsbold];
Column.Font.Color := clred;
end
else
begin
Column.Font.Color := cldefault;
//Column.Font.Style := Column.Font.Style - [fsbold];
end;
(Sender as TDBGrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);


另外还发现由于dbgrid的title里面字段balance的width默认是94的话,这个字段所有都是默认加粗的,运行时,鼠标拉动一下宽度,粗体就不显示了。如果设计时宽度调整为95以后,这列的值就不会加粗了。

...全文
994 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
g58521547 2021-05-05
  • 打赏
  • 举报
回复
还有一个问题就是 cds的计算字段,的值做判断的话,单步调试显示的值是0, 怎么判断?怎么能取得实际显示的值呢? if (datacol=24) and (Column.Field.AsInteger < fmmain.AdvanceDay) then //就是这句判断当前列的值是否小于30
sczyq 2021-05-05
  • 打赏
  • 举报
回复
以前我是使用 OnDrawColumnCell 来做的, 后来发现 OnGetCellParams 更好用了
xrbaa 2021-05-05
  • 打赏
  • 举报
回复
背景用这个成功 (Sender as TDBGrid).Canvas 前景用这个不成功 Column.Font.Color 要不要换成这样写法: (Sender as TDBGrid).Canvas.Pen 或者 (Sender as TDBGrid).Canvas.Font 你试试啊,我就不建数据库了。

5,915

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧