如何在显示之前操纵数据库网格的内容?

时间:2012-11-20 02:53:11

标签: delphi dbgrid tdbgrid

我在DB表中有一个存储压力的列。压力始终存储为PSI,可以通过潜水14.5转换为BAR。

用户可以使用无线电组切换PSI / BAR的显示。

我使用TStringGrid并转换为TDbGrid - 这对我来说很新鲜。

当用户切换PSI / BAR时,如何更新数据库网格中的显示? (我想我只是再次执行它的查询?或者调用query.Refresh()?)但是我该如何进行转换呢?

  1. 可能是一个存储过程,虽然看起来像过度杀伤和存储过程对我来说也是新的......
  2. 通过更改查询的SELECT语句?但是我该怎么做? SELECT pressure / 14.5 FROM measurements?或者怎么样?
  3. 或者我可以编码OnBeforeXXX()吗?或OnGetDisplayText()或其他一些?
  4. 我确信这是非常基本的,但直到现在我才刚刚显示未操作的数据,现在我需要转换功能。谷歌没有帮助,但我可能不知道该要求什么。

    我还想更改列标题的文本,在“Presure(PSI)”和“pressure(BAR)”之间切换。 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

为压力字段编写OnGetText事件处理程序,如下所示:

type
  TPressureMU = (pmuPSI, pmuBAR);

const
  PSIToBarFactor = 1/14.5;


procedure TdmData.qMeasurementsPressureGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  case PressureMU of
    pmuPSI: Text := FloatToStr(Sender.AsFloat); //Already PSI
    pmuBAR: Text := FloatToStr(Sender.AsFloat * PSIToBarFactor); //ConvertingToBAR
  end
end;

我正在使用声明枚举的属性PressureMU来控制压力是否显示在PSI或BAR测量单位中。

这样,当用户更改选择时,您只需调整该属性的值。

如果使用持久字段,可以使用对象检查器将事件处理程序直接链接到您的字段,如果不是,则可以通过以下代码执行:

begin
  qMeasurements.FieldByName('Pressure').OnGetText := qMeasurementsPressureGetText;
end;

其中qMeasurementsPressureGetText是方法的名称。

答案 1 :(得分:2)

创建持久字段(右键单击查询,然后选择Add Fields以在设计时创建存储在.dfm中的字段)。右键单击查询,然后添加新字段。将其设为计算字段,并在查询的OnCalcFields事件中执行从PSI到BAR的转换。

现在,当用户切换显示时,您只需显示PSIBAR列,然后设置Column.FieldName,将其设置为实际PSI列或tne新计算的BAR列。

当然,如果您不使用持久字段,则可以在查询中完成所有操作。只需在SQL语句中添加一个包含转换结果的新列,您仍然可以在运行时更改Column.FieldName以切换显示的值。