gpt4 book ai didi

delphi - 检查 TClientDataset 中的行是否已更改

转载 作者:行者123 更新时间:2023-12-03 15:04:40 26 4
gpt4 key购买 nike

我有一个包含 n 个字段的 TClientDataset,我必须循环遍历它们来计算有多少个字段已更改但正在执行:

if (Cds.fields1.Value <> Cds.fields1.OldValue) and (Cds.fields2.Value <> Cds.fields2.OldValue) etc....

或循环遍历 Cds.fields[I] 不是很“干净”

是否有 Cds.RowChanged 方法或其他方法?

最佳答案

您可以使用 TClientDataSet 的 UpdateStatus 属性来实现此目的:

if Cds.UpdateStatus = usModified then
// current row was changed

其他可能的值有 usUnmodifiedusInsertedusDeleted。与 TDataSet.Modified 属性不同,当前行的 UpdateStatus 在 CDS.Post 将其更改发布回 CDS 后仍然存在。显然,您的应用程序需要这些数值中的哪一个取决于您。

如在线帮助中所述,您可以使用 UpdateStatus 设置计算字段的值:

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
case TClientDataSet(DataSet).UpdateStatus of
usUnmodified: FieldByName('Status').AsString := '';
usModified: FieldByName('Status').AsString := 'M';
usInserted: FieldByName('Status').AsString := 'I';
usDeleted: FieldByName('Status').AsString := 'D';
end;
end;

您还可以使用其 StatusFilter 属性临时过滤 TClientDataSet 以选择具有特定 UpdateStatus 的行:

procedure TCDSForm.Button1Click(Sender: TObject);
begin
if CDS.StatusFilter = [] then
CDS.StatusFilter := [usModified]
else
CDS.StatusFilter := [];
Caption := IntToStr(CDS.RecordCount);
end;

请注意,StatusFilter 设置为 usModifiedCDS.RecordCount 不一定返回与 CDS.ChangeCount 相同的值 属性,因为 ChangeCount 值包括插入的行数以及已修改的行数。

关于delphi - 检查 TClientDataset 中的行是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38269301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com