如何在 Delphi 中使用onDrawColumnCell来更改单元格文本而不使用textout?

1qczuiv0  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(174)

我想问一下,是否有其他方法可以不使用TextOut()来修改单元格文本?使用TextOut()需要坐标,我不想混入其中。此外,我只想更改文本并保留其他一切,如颜色、字体、对齐方式等。
我的目的是改变文本在不同场景中的显示。例如:

  • 我可能希望在不同的列中以不同的格式显示日期字段,例如在MM/yyyy中显示一列,在MM/dd/yyyy中显示另一列。
  • 我可能希望显示一些具有integer/float数据类型的行,如果数字高于或低于某个阈值,则用文本显示“too high”或“too low”。
  • 我可能想交换布尔真/假与一些文本或数字,因为我认为合适。
  • 或者在某些条件下只清空某些单元格。

我知道如果TDBGrid是“可编辑的”,这将是一个坚韧做编辑的挑战。所以我打算在一个不可编辑的网格中使用任何解决方案。而且,我不想转移到TStringGrid,因为我发现TDBGrid很容易处理数据集。
顺便说一句,我用的是 Delphi 7。
对于在特定条件下将某个单元格留空的情况,是否可以发出“exit”命令跳过单元格值显示到单元格本身?
比如:

procedure Tform1.dbgrdDrawColumnCell(Sender: TObject;  const Rect: TRect; DataCol: Integer; Column: TColumn;  State: TGridDrawState);
begin
  if (Column.fieldname = 'total') and (column.field.value=0) then 
    exit 
  else
    dbgrdsku.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
4uqofj5v

4uqofj5v1#

如果您正在使用TDBGrid和数据源,则在直接选择在Grid中进行更改之前,请检查在数据源(在TFields上)中进行更改是否有用。
使用Datasource并不需要花费太多的资源来绘制。当到达那个点(绘制)时,数据可能已经被更改了。
您可以在TDataset的后代(TQuery、TADOQuery、TFDQuery ...)上创建TFields,并使用OnGetText事件来更改要绘制的文本。
如果是这样的两个字段:

用这样一个简单的代码使用OnGetText的两个字段:

procedure TForm3.ADOQuery1DatosGrupoGetText(Sender: TField; var Text: string;  DisplayText: Boolean);
begin
  // too hight for number greater than 5
  if (not Sender.IsNull) then
    if (Sender.AsInteger > 5) then
      Text := 'too hight!'
    else
      Text := Sender.AsString;
end;

procedure TForm3.ADOQuery1fechaGetText(Sender: TField; var Text: string;  DisplayText: Boolean);
begin
  // Change the date format
  if (not Sender.IsNull) then
    Text := formatDateTime('MM/yyyy', Sender.AsDateTime)
end;

您得到了以下结果:

相关问题