1

为了我自己的利益,我可能太聪明了:-/

我有一张桌子,里面有一些压力测量值。这些始终存储为 PSI,但用户可以选择单选组按钮在 PSI 和 BAR 之间切换。

为了保持代码干净并将工作推送到数据库,我为configuration项目创建了第二个表,只有一行。当用户切换无线电组时,一列psi_bar_conversion将采用值 1 或 14.5。

在 Delphi 中,与我的数据库网格相关联的查询是使用如下语句设置的

SELECT ROUND(inlet_waterPressure_psi  /  
                  (SELECT psi_bar_conversion FROM configuration), 
             (SELECT float_precision FROM configuration))
       AS inlet_waterPressure, 
FROM measurements

所有这些都很好(也许我解释得太多了)。

我要做的就是在处理单选按钮切换的函数中添加一些代码,以强制我的数据库网格刷新其内容,因为我刚刚更新了configuration.psi_bar_conversion(但没有我的查询的直接字段,也没有我的数据源)。

我应该调用Refresh()Invalidate()SomeOtherFunction()- 数据库网格、查询、数据源吗?这就是让我困惑的地方。

在此先感谢您的帮助....

4

3 回答 3

3

TDBGrid 表示依赖于连接的 TDataSet(通过 TDataSource)。

TDataSet要更新网格值,您必须使用方法刷新数据TDataSet.Refresh

要更新特殊的 Grid,您可以像这样刷新连接的 DataSet:

DBGrid1.DataSource.DataSet.Refresh;

但是一些 TDataSet 后代不会刷新,Embarcadero 记录了这一点

TDataSet.Refresh

这取决于您使用的组件(我用 UniDAC 进行了测试,它工作正常)

procedure TForm1.RadioGroup1Click( Sender : TObject );
var
  LRate : Extended;
begin
  case RadioGroup1.ItemIndex of
    0 :
      LRate := 1;
    1 :
      LRate := 14.5;
  end;
  UniConnection1.ExecSQL( 'UPDATE configuration SET psi_bar_conversion = :conversion', [LRate] );
  DBGrid1.DataSource.DataSet.Refresh;
end;

如果您的组件在调用 Refresh 时没有重新获取数据,那么您必须关闭并重新打开(也由文档说明)

DBGrid1.DataSource.DataSet.Close;
DBGrid1.DataSource.DataSet.Open;

恕我直言,此类组件尚未完全实现,因此这只是一种解决方法,在调用某些可能不需要的事件(BeforeClose、AfterClose、BeforeOpen、AfterOpen)时会产生副作用,这些事件不会使用 Refresh 触发。

但它根本与 SubSelects 无关。

于 2012-12-06T13:30:09.607 回答
3

您需要关闭然后重新打开查询以使更改生效psi_bar_conversionfloat_precision生效。两个子选择(对于 from 的值configuration)仅在执行查询时发生。

于 2012-11-30T03:31:39.087 回答
0

我很害怕我无法帮助你解决德尔福方面的问题。

在数据库方面......

是否有任何理由不能将 bar 和 psi 值都存储在数据库中?

您可以在保存时进行转换,然后您只需在要查看数据时对数据进行简单的选择。这可以通过执行保存的软件或数据库中的触发器来完成。

我建议这样做的原因是 psi-bar 转换率不会改变,因此您每次查看不需要的数据时都会进行大量处理......

于 2012-12-06T13:41:09.193 回答