3

我有一个绑定到 DBGrid 的 TZTable (ZEOSlib) 现在我需要知道用户更改了哪个特定的 TField。

我试过了

if NOT (taPositionenArtNrGH.NewValue = taPositionenArtNrGH.OldValue) then
    ShowMessage('ArticleNumber changed');

我把代码放在

  • 发布前、更新记录、发布后

但在调试器中 OldValue 始终是 NewValue。如何检查哪个字段已更改?

4

3 回答 3

2

你可以用UpdateStatus : TUpdateStatus这个。例如:

  1. 将 ZTable.CachedUpdates 设置为 true;
  2. 创建名为“状态”的新计算字段。
  3. 要显示字段“FNAME”的旧值,请创建名为“FNameOldValue”的新计算字段
  4. 在 OnCalcFields 事件中使用:

    procedure TDM1.ZTable1CalcFields(DataSet: TDataSet);
    begin
      if ZTable1.UpdateStatus in [usModified] then
        begin
          ZTable1Status.value := 'Modified';
          ZTable1FNameOldValue.value := ZTable1FNAME.OldValue;
        end
      else
        ZTable1Status.value := 'UnModified'
    end;
    

结果 :

在此处输入图像描述

编辑:

您可以检测字段级别的更改,例如:

if ZTable1.UpdateStatus in [usModified] then
  begin
    for I := 0 to ZTable1.Fields.Count - 1 do
      begin
        if ZTable1.Fields[i].OldValue <> ZTable1.Fields[i].NewValue  then
          -- do something with this field
      end;
   end; 
于 2016-01-29T11:14:57.590 回答
1

根据文档

NewValue 属性仅在使用 TClientDataSet 组件访问数据或启用缓存更新时可用。

于 2016-01-29T09:44:36.047 回答
1

如果你只想知道哪些字段发生了变化,为什么不使用TField.OnChange事件呢?您可以在此事件中填写字段名称列表并将其清除为OnAfterPost. 但是该Modified属性确实非常有用;奇怪的是它还没有实施。

于 2016-01-29T13:55:52.677 回答