为什么 tDataSet.Append 不自动调用 Post
Why not tDataSet.Append automatically call Post
DelphitDataSet.Append好像不叫Post。在它的参考中它说
Dataset methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.
但是我在下面的代码中没有看到递增的 RecordCount。
Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // 0
FDMemTable1.Append;
Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // still 0
如果我在 Append 后插入 FDMemTable1.Post,结果显示 RecordCount 为 1。
所以它完全按照它说的做...
//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 时,post 什么也没有。
Why not tDataSet.Append automatically call Post?
因为它首先会打败调用Append的对象;如果它确实自动调用 Post,则会导致将空白记录发布到 table,而没有机会首先设置其字段值。同样,在编辑或插入后自动调用 Post 也会防止任何字段值被用户代码更改
您引用的声明来自 http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_Post.html
imo 充其量是措辞不当,因为它可能 mis-read 给人的印象是 "Dataset methods that change the dataset state, such as Edit, Insert, or Append [...] automatically call Post" 在方法的末尾 ,但事实并非如此因为我已经说过的原因。 imo,它应该说的是,与 First、Last、Next 和 Prior 等导航方法一样,这些方法将以 Post 开始,如有必要,在当前记录 上自动调用before 方法的其余部分执行。这是因为这些方法总是首先调用 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;
DelphitDataSet.Append好像不叫Post。在它的参考中它说
Dataset methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.
但是我在下面的代码中没有看到递增的 RecordCount。
Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // 0
FDMemTable1.Append;
Memo1.Lines.Add(IntToStr(FDMemTable1.RecordCount)); // still 0
如果我在 Append 后插入 FDMemTable1.Post,结果显示 RecordCount 为 1。
所以它完全按照它说的做...
//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 时,post 什么也没有。
Why not tDataSet.Append automatically call Post?
因为它首先会打败调用Append的对象;如果它确实自动调用 Post,则会导致将空白记录发布到 table,而没有机会首先设置其字段值。同样,在编辑或插入后自动调用 Post 也会防止任何字段值被用户代码更改
您引用的声明来自 http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_Post.html
imo 充其量是措辞不当,因为它可能 mis-read 给人的印象是 "Dataset methods that change the dataset state, such as Edit, Insert, or Append [...] automatically call Post" 在方法的末尾 ,但事实并非如此因为我已经说过的原因。 imo,它应该说的是,与 First、Last、Next 和 Prior 等导航方法一样,这些方法将以 Post 开始,如有必要,在当前记录 上自动调用before 方法的其余部分执行。这是因为这些方法总是首先调用 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;