如何通过 ZeosLib 找出 delphi 6 TZTable 中更改了哪个字段
How to find out which field was changed in a delphi 6 TZTable via ZeosLib
我有一个绑定到 DBGrid 的 TZTable (ZEOSlib),现在我需要知道用户更改了哪个特定的 TField。
我试过
if NOT (taPositionenArtNrGH.NewValue = taPositionenArtNrGH.OldValue) then
ShowMessage('ArticleNumber changed');
我把代码放在了
- 发布前、更新记录、发布后
但在调试器中,旧值始终是新值。如何检查更改了哪个字段?
The NewValue property is only usable when the data is accessed using
a TClientDataSet component or cached updates is enabled.
您可以为此使用 UpdateStatus : TUpdateStatus
。例如:
- 将 ZTable.CachedUpdates 设为真;
- 创建名为 "Status" 的新计算字段。
- 要显示字段 "FNAME" 示例的旧值,请创建名为 "FNameOldValue"
的新计算字段
在 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;
如果你只是想知道哪些字段被更改了,为什么不使用 TField.OnChange
事件呢?您可以在此事件中填写字段名称列表,并在 OnAfterPost
中将其清除。但是 Modified
属性 确实非常有用;奇怪的是还没有实现。
我有一个绑定到 DBGrid 的 TZTable (ZEOSlib),现在我需要知道用户更改了哪个特定的 TField。
我试过
if NOT (taPositionenArtNrGH.NewValue = taPositionenArtNrGH.OldValue) then
ShowMessage('ArticleNumber changed');
我把代码放在了
- 发布前、更新记录、发布后
但在调试器中,旧值始终是新值。如何检查更改了哪个字段?
The NewValue property is only usable when the data is accessed using a TClientDataSet component or cached updates is enabled.
您可以为此使用 UpdateStatus : TUpdateStatus
。例如:
- 将 ZTable.CachedUpdates 设为真;
- 创建名为 "Status" 的新计算字段。
- 要显示字段 "FNAME" 示例的旧值,请创建名为 "FNameOldValue" 的新计算字段
在 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;
如果你只是想知道哪些字段被更改了,为什么不使用 TField.OnChange
事件呢?您可以在此事件中填写字段名称列表,并在 OnAfterPost
中将其清除。但是 Modified
属性 确实非常有用;奇怪的是还没有实现。