1

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

更改数据集状态的数据集方法(例如 Edit、Insert 或 Append)或从一条记录移动到另一条记录的数据集方法(例如 First、Last、Next 和 Prior)会自动调用 Post。

但我没有在下面的代码中看到增加的 RecordCount。

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

FDMemTable1.Append;

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

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

4

2 回答 2

5

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

因为它首先会破坏调用 Append 的对象;如果它确实自动调用 Post,则会导致将空白记录发布到表中,而没有机会首先设置其字段值。同样,在 Edit 或 Insert 之后自动调用 Post 也会阻止用户代码更改任何字段值

您从http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_Post.html引用的声明 充其量是 imo 措辞不当,因为它可能被误读给给人的印象是“改变数据集状态的数据集方法,例如 Edit、Insert 或 Append [...] 会自动调用 Post” 因为我已经说明了原因。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;
于 2019-05-23T10:15:33.553 回答
3

所以它完全按照它所说的......

//Dataset.State = dsBrowse
Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // 0

FDMemTable1.Append;
//now Dataset.State = dsInsert

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // still 0, previous record not yet posted.

FDMemTable1.Append; //because Dataset.State <> dsBrowse, it now post pending changes

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // Now 1, Dataset.State = dsInsert 

FDMemTable1.Post;

Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // Now 2, Dataset.State = dsBrowse 

第一次调用 Append 时,没有什么可发布的。

于 2019-05-23T03:40:38.567 回答