delphi7 dbgrideh符合条件的数据显示颜色后,符合条件数据显示红色 数据量大会很卡,怎么设置只在当前屏幕范围内的数据进行颜色显示,不对所有数据都进行判断和颜色设置,这样可以减少不必要的计算量。
时间: 2023-06-26 07:07:58 浏览: 104
ExportMultiTitle_delphi_
可以使用 `DBGridEh` 的 `OnDrawColumnCell` 事件,在该事件中判断当前单元格是否符合条件,如果符合则设置颜色,否则不设置颜色。同时,可以通过 `DBGridEh` 的 `VisibleRowCount` 属性获取当前屏幕范围内显示的行数,只对这些行进行颜色设置,避免对所有数据进行判断和颜色设置。
以下是示例代码:
```delphi
procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
var
Grid: TDBGridEh;
DataSet: TDataSet;
VisibleRowCount, i: Integer;
begin
Grid := Sender as TDBGridEh;
DataSet := Grid.DataSource.DataSet;
if (not DataSet.IsEmpty) and (Column.FieldName = 'FieldName') and (DataSet.FieldByName('FieldName').AsInteger = 1) then
Grid.Canvas.Brush.Color := clRed;
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
if (not DataSet.IsEmpty) and (Column.FieldName = 'FieldName') and (DataSet.FieldByName('FieldName').AsInteger = 1) then
Grid.Canvas.Brush.Color := clWindow;
// 只对当前屏幕范围内的行进行颜色设置
VisibleRowCount := Grid.VisibleRowCount;
for i := Grid.Row to Grid.Row + VisibleRowCount - 1 do
begin
if (not DataSet.IsEmpty) and (DataSet.RecNo = i) and (Column.FieldName = 'FieldName') and (DataSet.FieldByName('FieldName').AsInteger = 1) then
begin
Grid.Canvas.Brush.Color := clRed;
Grid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
Grid.Canvas.Brush.Color := clWindow;
end;
end;
end;
```
在上述代码中,我们首先判断当前单元格是否符合条件,如果符合则设置颜色为红色,否则不设置颜色。接着调用 `Grid.DefaultDrawColumnCell` 方法绘制单元格,最后再将颜色设置为白色。
然后,我们通过循环遍历当前屏幕范围内的行,对每一行进行判断和颜色设置。这样只会对当前屏幕范围内的行进行颜色设置,可以减少不必要的计算量,提高性能。
阅读全文