为什么不tDataSet.Append自动调用Post

SHI*_*Guk 0 delphi tdataset firedac

Delphi tDataSet.Append似乎不调用Post。它在参考中说

更改数据集状态的数据集方法(例如“编辑”,“插入”或“追加”)或从一个记录移至另一条记录(例如“第一”,“最后”,“下一个”和“上一步”)的数据集方法会自动调用“发布”。

但是在以下代码中我看不到增加的RecordCount。

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // 0

FDMemTable1.Append;

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // still 0
Run Code Online (Sandbox Code Playgroud)

如果我在Append之后插入FDMemTable1.Post,结果将显示RecordCount为1。

Mar*_*ynA 5

为什么不tDataSet.Append自动调用Post?

因为它将首先击败调用Append的对象;如果确实调用了Post,则会导致将空白记录发布到表中,而没有机会首先设置其字段值。同样,在“编辑”或“插入”后自动调用“发布”也会防止用户代码更改任何字段值

您从http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_Post.html引用的陈述 充其量是不正确的imo,因为它可能会被误读以给出在该方法的末尾有一种印象,即“更改数据集状态的数据集方法,例如“编辑”,“插入”或“追加”将自动调用“发布”” ,这不是我所说的原因。imo应该说的是,与诸如First,Last,Next和Prior之类的导航方法一样,这些方法将以在其他方法执行之前在需要时在当前记录上自动调用Post开头。这是因为这些方法始终CheckBrowseMode是第一步的调用,其中包含代码

procedure TDataSet.CheckBrowseMode;
begin
  CheckActive;
  DataEvent(deCheckBrowseMode, 0);
  case State of
    dsEdit, dsInsert:
      begin
        UpdateRecord;
        if Modified then Post else Cancel;
      end;
    dsSetKey:
      Post;
  end;
end;
Run Code Online (Sandbox Code Playgroud)