检查TClientDataset中是否更改了行

Luc*_*fen 5 delphi tclientdataset

我有一个带有n个字段的TClientDataset,我必须循环遍历它们以计算有多少已经改变但是做了:

if (Cds.fields1.Value <> Cds.fields1.OldValue) and (Cds.fields2.Value <> Cds.fields2.OldValue) etc....
Run Code Online (Sandbox Code Playgroud)

或者通过Cds.fields循环[I]不是很"干净"

有Cds.RowChanged方法还是什么?

Mar*_*ynA 12

您可以使用TClientDataSet的UpdateStatus属性:

if Cds.UpdateStatus = usModified then
  //  current row was changed
Run Code Online (Sandbox Code Playgroud)

其他可能的值是usUnmodified,usInsertedusDeleted.与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;
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,CDS.RecordCountStatusFilter设置为usModified不一定返回的值相同的CDS.ChangeCount属性,因为该ChangeCount值包含的行数插入以及已数修改.