繁体   English   中英

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

[英]How to use onDrawColumnCell to change cell text without using textout on Delphi?

我想问一下是否有另一种方法可以在不使用TextOut()的情况下更改单元格文本? 使用TextOut()需要我不想混入的坐标。 此外,我只想更改文本并保留其他所有内容,如颜色、字体、alignment 等。

我的目的是改变不同场景中文本的显示。 例如:

  • 我可能想在不同的列中以不同的格式显示日期字段,例如一列显示在MM/yyyy中,另一列显示在MM/dd/yyyy中。
  • 如果数字高于或低于某个阈值,我可能想显示一些具有整数/浮点数据类型的行,并带有显示“太高”或“太低”的文本。
  • 我可能想用我认为合适的一些文本或数字交换 boolean true/false。
  • 或者,也许只是在某些条件下空白一些单元格。

我知道如果TDBGrid是“可编辑的”,这将是进行编辑的一项艰巨挑战。 所以我打算在不可编辑的网格中使用任何解决方案。 而且,我不想转向TStringGrid ,因为我发现TDBGrid很容易处理数据集。

顺便说一句,我正在使用 Delphi 7。

对于仅在特定条件下将特定单元格留空,是否可以发出“退出”以跳过将单元格值显示到单元格本身?

喜欢:

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;

如果您正在使用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;

你得到了这个结果:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM